STM32串口通讯协议

2019-07-14 23:12发布

想写一个串口程序,可是通讯协议一直搞不明白,怎么设定帧头帧尾和数据位,怎么去识别呢???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
和佳医疗
1楼-- · 2019-07-15 12:28
laidaihua 发表于 2014-10-29 13:59
预先设置好一个发送缓冲区,先将帧头帧尾存到发送缓冲区对应位置。
要发送一帧数据前,先将待发数据填入缓 ...

大神,我们有些都是初学者,没见过高山,入门的时候难免会迷茫,给大家分享一个感觉比较好用的串口代码吧,感激不尽!
laidaihua
2楼-- · 2019-07-15 14:38
先写个发送的例子吧,以TI Cortex-M3为例:
// 定义一个10字节的发送缓冲区(如果内存充足,最好定义成全局变量,用起来比较方便)
// 这里假设你的通讯协议定义的一帧数据包中有10个字节:
// 第1字节为帧头,第2字节为设备识别码,后面有7字节的数据,最后一字节为校验和
unsigned char UART0SendBuf[10];

// 通过串口0发送若干个字节数据的函数
void Uart0SendOut(const unsigned char* pData, unsigned int len)
{
   unsigned char i;

   for(i = 0;i < len; i++)
      UARTCharPut(UART0_BASE, pData[i]);
}

// 在需要通过串口0发送数据的地方使用如下代码
   unsigned char i, j;
   unsigned char CheckSum;
   
   UART0SendBuf[0] = FRAME_HEAD;// FRAME_HEAD为帧头的宏定义
   UART0SendBuf[1] = DEVICE_ID;// DEVICE_ID为设备识别码(取决于通讯协议中是否有此项)
   CheckSum = 0;
// 这里就是你将自己想要发送的数据填充到缓冲区的代码了,请根据实际需求来修改
// 假设你要发送的7字节数据就在UserData[]数组中
   for(i=0;i<7;i++)
   {
      UART0SendBuf[i+2] = UserData[i];
      CheckSum += UserData[i];
   }
   UART0SendBuf[9] = CheckSum;// 计算校验和
   Uart0SendOut(UART0SendBuf,10);// 这里就是将一帧数据发送出去的语句了,采用的是函数调用的方式。
laidaihua
3楼-- · 2019-07-15 16:37
 精彩回答 2  元偷偷看……
土豆洋芋小
4楼-- · 2019-07-15 17:47
laidaihua 发表于 2014-11-24 16:22
不好意思,上面有一行注释放错位置了,订正如下:
     CheckSum += UserData;// 计算校验和

非常感谢,真是帮了我大忙了,我一定会好好体会学习的。
1137858629
5楼-- · 2019-07-15 18:31
当发送一个9位数据呢?如何用9位数据来区别地址与数据帧
laidaihua
6楼-- · 2019-07-15 23:34
1137858629 发表于 2014-11-30 16:26
当发送一个9位数据呢?如何用9位数据来区别地址与数据帧

如果是用的直接支持9bit数据UART的MCU,在发送前直接设置数据或地址标识就可以了;
如果是需要手动设置9bit数据的MCU,则在每帧数据发送时单独设置控制位。

一周热门 更多>