单片机 串口以二进制发送数据

2019-04-15 12:21发布

平时串口按字符发送数据,这样发送数据简单,直接用“串口调试助手”就可接受数据,方便调试。
如果用二进制发送数据,发送内容会大大减少,因为不用把二进制转换成字符了。不过需要自己写上位机接收程序,按固定的大小接受数据,然后解析数据。
单片机二进制发送串口示例代码
void(){
 S s;
 byte * p=&s;
 size=sizeof(S);
 for(int i=0;i++;i  sendOneByte(p);
  p++;
 }
}
其中s是一个结构体
上位机接收串口数据示例代码
if(::ReadCommBlock(m_ComConfig,buffer,sizeof(s))!=0)
 {
  status=*((Status*)buffer);
  str.Format("%lu/t%lu/t%lu/t%lu/t%lu/t/r/n",ntohl(status.time_step),ntohl(status.sensor),ntohl(status.left_speed),ntohl(status.right_speed),ntohl(status.direct));
  fprintf(file,str);
}
其中s为相同的结构体 可能会遇到的问题:
单片机复位时,串口端电平改变会造成串口发送若干字节。这需要在上位机程序处首先读取该字节,然后抛弃。我测试的该字节为一个字节。
单片机发送数据和电脑CPU字节顺序可能不一样,可能一个是小端,一个是大端。这需要实际测试,如果字节顺序不一样,需用ntohl或者ntohs转换字节顺序
上位机软件用VC的MSCOMM完成的,其参数的默认值要改变:RThreshold 为1
InputMode为1,另Setting参数设置波特率的