arduino串口接收的问题
我用auduino的串口向人机界面发送了16进制数据串,例如:发送【013E0088A3】人机界面马上会返回一串16进制数【013E0423322E87EFA4】,所以发...
我用auduino的串口向人机界面发送了16进制数据串,例如: 发送【 01 3E 00 88 A3】 人机界面马上会返回一串16进制数 【01 3E 04 23 32 2E 87 EF A4】 ,所以发送完数据后需要马上开始接收,怎么写程序能不漏掉数据,怎么样能够及时准确的接收数据,接收到以后需要把它存在数组中再判断或提取数据
/*********************************** 下面是串口发送16进制串的函数 *******************************************/
void UART_SendPacked(unsigned char Command,unsigned char *p,unsigned char num)
{
unsigned char Index=0;
unsigned char check=0;
while(UART_TX_Status==1);//等待串口空闲
UART_TX_Status = 1;//,串口忙标志置1,开始新一轮传输
Serial.flush();//Clear serial_buf
UART_TX_Buffer[Index++] = 0x55; //UART_TX_Buffer[0]=Command;命令1字节
UART_TX_Buffer[Index++] = num+1; //UART_TX_Buffer[1]=num+1; 长度1字节
UART_TX_Buffer[Index++] = Command; //校验=命令+数据(num+1字节)和取低8位
check = Command;
while(num--) //计算校验值(在Command基础上继续累加num个数据)得到校验原值
{
UART_TX_Buffer[Index++] = *p;
check += *p++;
}
UART_TX_Buffer[Index++] = check;// 校验原值的低8位【1个字节】作为校验值
UART_TX_Buffer[Index++] = 0xaa;//结束标志:0xAA
UART_TX_Number = Index;//所有数据已写入数组中,得到数组长度
Serial.write(UART_TX_Buffer,UART_TX_Number);
UART_TX_Status=0;
}
/* 例如,执行下面函数会发送16进制串,屏幕收到后会进入休眠,并返回一串16进制数给arduino */
void LCDSetWaitMode(void)//一级休眠
{
Send_Buffer[0] = 0xa5;
UART_SendPacked(0x8c,Send_Buffer,1);
}
/*然后就是怎么接收返回的16进制串的问题,我是这样写的,但是不放心,觉得不靠谱,还请大家帮忙*/
// 分数不够了,大家谅解一下,感谢!
void rev(int num_rev)
{
Serial.flush(); //清空串口缓存区
while(Serial.read() >= 0); //这句好像也是可以清空串口缓存区,好像用上面那句的话有时候会有旧数 据,不能全部替换为新数据,前几天遇到过这个问题,很奇怪。
if(Serial.available())
{
Receive_Buffer[cc++]=Serial.read();
}
if(cc>num_rev)
{
Serial.write(Receive_Buffer,cc);
cc=0;
}
} 展开
/*********************************** 下面是串口发送16进制串的函数 *******************************************/
void UART_SendPacked(unsigned char Command,unsigned char *p,unsigned char num)
{
unsigned char Index=0;
unsigned char check=0;
while(UART_TX_Status==1);//等待串口空闲
UART_TX_Status = 1;//,串口忙标志置1,开始新一轮传输
Serial.flush();//Clear serial_buf
UART_TX_Buffer[Index++] = 0x55; //UART_TX_Buffer[0]=Command;命令1字节
UART_TX_Buffer[Index++] = num+1; //UART_TX_Buffer[1]=num+1; 长度1字节
UART_TX_Buffer[Index++] = Command; //校验=命令+数据(num+1字节)和取低8位
check = Command;
while(num--) //计算校验值(在Command基础上继续累加num个数据)得到校验原值
{
UART_TX_Buffer[Index++] = *p;
check += *p++;
}
UART_TX_Buffer[Index++] = check;// 校验原值的低8位【1个字节】作为校验值
UART_TX_Buffer[Index++] = 0xaa;//结束标志:0xAA
UART_TX_Number = Index;//所有数据已写入数组中,得到数组长度
Serial.write(UART_TX_Buffer,UART_TX_Number);
UART_TX_Status=0;
}
/* 例如,执行下面函数会发送16进制串,屏幕收到后会进入休眠,并返回一串16进制数给arduino */
void LCDSetWaitMode(void)//一级休眠
{
Send_Buffer[0] = 0xa5;
UART_SendPacked(0x8c,Send_Buffer,1);
}
/*然后就是怎么接收返回的16进制串的问题,我是这样写的,但是不放心,觉得不靠谱,还请大家帮忙*/
// 分数不够了,大家谅解一下,感谢!
void rev(int num_rev)
{
Serial.flush(); //清空串口缓存区
while(Serial.read() >= 0); //这句好像也是可以清空串口缓存区,好像用上面那句的话有时候会有旧数 据,不能全部替换为新数据,前几天遇到过这个问题,很奇怪。
if(Serial.available())
{
Receive_Buffer[cc++]=Serial.read();
}
if(cc>num_rev)
{
Serial.write(Receive_Buffer,cc);
cc=0;
}
} 展开
1个回答
展开全部
我建议用串行中断子程序,基本不会错.
void serialEvent()
{//statements}
int inByte = Serial.read();
Serial.write(inByte);
}
这个函数错误很小
void serialEvent()
{//statements}
int inByte = Serial.read();
Serial.write(inByte);
}
这个函数错误很小
追问
serial.event() 是中断方式接收数据吗? 就是我不用在主程序中写接收函数了,只要判断自定义的那个数组中的数据就行?
我是16进制数,那串口的中断是怎么触发的,是来一个字节的起始位,触发一次中断,接收一个完字节后,存入缓冲区,avalible()++,然后才进入void event(){}函数吗?我是这样理解的不知道是不是对
追答
来数据就执行中断程序,你中断里读数据,读完后清除缓存,这就基本不会错。很问题屡试不爽!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询