各位大神,我用的是LPC1114的芯片,同时发送几条命令出去接收数据时,只能接收到一条命令返回的数据,如果一条命令返回的数据字节数太多的话也是接收不全,麻烦各位大神帮我看一下,下面是我的程序:
void SP485init2(uint32_t baudrate1)
{
uint16_t usFdiv;
uint32_t DL_value1,Clear1=Clear1; //Clear2=Clear2解决Clear2=0时编译出现警告
/*使能并设置串口2时钟*/
//使能串口2时钟
LPC_SYSCON->SYSAHBCLKCTRL|=(1<<19);
//串口2时钟分频为1:1
LPC_SYSCON->UART1CLKDIV =0x01;
//8位传输,1个停止位,无奇偶校验,允许访问除数寄存器
LPC_UART1->LCR = 0x83;
//计算该波特率要求的除数锁存寄存器值
DL_value1 = 48000000/16/baudrate1;
//写除数锁存寄存器高位值
LPC_UART1->DLM = DL_value1/256;
//写除数锁存寄存器低位值
LPC_UART1->DLL = DL_value1%256;
//DLAB位置0,禁止对除数锁存寄存器的访问
LPC_UART1->LCR = 0x03;
//允许FIFO,清空Rx0FIFO 和 Tx0FIFO 8个字节触发
LPC_UART1->FCR = 0xc7;
//读UART1状态寄存器清空残留状态
Clear1 = LPC_UART1->LSR;
//开串口中断
NVIC_EnableIRQ(UART1_IRQn);
NVIC_SetPriority(UART1_IRQn,1);
//开串口接收中断
LPC_UART1->IER=0x01;
}
void UART1_IRQHandler(void)
{
uint8_t errr=0;
uint8_t i;
while ((LPC_UART1->IIR&0x01) == 0)
{ /* 判断是否有中断挂起 */
switch ((LPC_UART1->IIR>>1)&0x07) /* 判断中断标志 */
{
case 0x02: /* 接收数据中断 */
{
P485count2 = 0;
P485rxOK2=1;
for(i=0;i<P485count2;i++)
{
P485buf2[P485count2]=LPC_UART1->RBR;
P485count2++;
}
P485rxLEN2=P485count2; //存储数据长度
// P485buf2[P485count2]=' '; //末尾加字符串结束符
break;
}
case 0x06: /* 字符超时中断 */
{
P485count2 = 0;
P485rxOK2=1;
while ((LPC_UART1->LSR&0x01) == 0x01) /* 判断数据是否接收完毕 */
{
P485buf2[P485count2]=LPC_UART1->RBR;
P485count2++; //清计数器
}
// while((LPC_UART1->LSR&0x01) == 0x01);
P485rxLEN2=P485count2; //存储数据长度
// P485buf2[P485count2]=' '; //末尾加字符串结束符
break;
}
default:
break;
}
}
}
void LPC_Read(uint8_t slave_id,uint16_t address,uint16_t RegCount)
{
uint16_t crc_det = 0;
uint8_t MainSendBuf[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
MainSendBuf[0]=slave_id; //从机地址
MainSendBuf[1]=0x03; //功能码
MainSendBuf[2]=(uint8_t)(address>>8); //器件起始地址高字节
MainSendBuf[3]=(uint8_t)address; //器件起始地址低字节
MainSendBuf[4]=(uint8_t)(RegCount>>8); //寄存器数高字节
MainSendBuf[5]=(uint8_t)RegCount; //寄存器数低位
crc_det = CRC16(MainSendBuf,6); //算CRC16校验值
MainSendBuf[6]=(uint8_t)(crc_det); //CRC校验低字节
MainSendBuf[7]=(uint8_t)(crc_det>>8); //CRC校验高字节
SP485Send2(MainSendBuf,8);
}
void pmc(void)
{
LPC_Read(0x64,0x0016,0x0002); //发送读请求命令
delay_ms(20);
LPC_Read(0X64,0X0020,0X0001);
delay_ms(20);
if(P485rxOK2==1)
{
P485rxOK2=0;
if(P485buf2[2]==0X04)
{
// Regbuf[322] = P485buf2[3];
// Regbuf[323] = P485buf2[4];
// Regbuf[326] = P485buf2[5];
// Regbuf[327] = P485buf2[6];
SP485Send2(P485buf2,P485rxLEN2);
}
else if(P485buf2[2]==0X02)
{
// Regbuf[330] = P485buf2[3];
// Regbuf[331] = P485buf2[4];
SP485Send2(P485buf2,P485rxLEN2);
}
}
}
此帖出自
小平头技术问答
P485rxOK2=1;
while ((LPC_UART1->LSR&0x01) == 0x01) /* 判断数据是否接收完毕 */
{
P485buf2[P485count2]=LPC_UART1->RBR;
P485count2++; //清计数器
}
建议不要写这么复杂,中断里面,执行的东西,尽量,少而简单。一个变量++就够了。把寄存器的数送入数组。主循环中,判断变量的值,是否需要归零。
一周热门 更多>