平时串口按字符发送数据,这样发送数据简单,直接用“串口调试助手”就可接受数据,方便调试。
如果用二进制发送数据,发送内容会大大减少,因为不用把二进制转换成字符了。不过需要自己写上位机接收程序,按固定的大小接受数据,然后解析数据。
单片机二进制发送串口示例代码
void(){
S s;
byte * p=&s;
size=sizeof(S);
for(int i=0;i++;i<size){
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参数设置波特率的