串口通信协议的规定和处理?

sunny_may 2007-05-08 02:02:59
请教各位,我用串口进行通信,可以收发数据正常,不过工程应用中需要确保传输的正确性,所以现在想请教如何规定通信协议,和怎么处理收到的数据?

我查了些资料,不过没有具体实例,还是不太明白,我的理解大概是这样的吧,

数据帧格式:帧头+数据+类型+校验和+帧尾。
可是在程序中具体该怎么实现,还是一头雾水,收到的数据可以存储到一个字符指针变量中,可是怎么提取有用的数据呢?
...全文
4627 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
xueliyumu 2011-07-01
  • 打赏
  • 举报
回复
路过看看了!!!!!!!!!!!!!!
laowang2 2011-06-30
  • 打赏
  • 举报
回复
bzworinima 2011-06-27
  • 打赏
  • 举报
回复
用SPCOMM 控件的话,监听事件中
var
myBuffer: TBytes; //数据提取
CommReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);

CopyMemory(@myBuffer[0], Buffer, BufferLength);

拿到myBuffer后,对数据进行 包头包尾检查, 和校验码检查
小_阳仔 2011-06-27
  • 打赏
  • 举报
回复
唉我也很头疼啊唉
432423423423 2011-03-11
  • 打赏
  • 举报
回复
建议可以采用一发一收协议,若接收不成功,可在此发送,重复6次,若收不到想要的数据 ,即可认为系统出现问题,而体制操作!
yskcg 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunny_may 的回复:]
请教各位,我用串口进行通信,可以收发数据正常,不过工程应用中需要确保传输的正确性,所以现在想请教如何规定通信协议,和怎么处理收到的数据?

我查了些资料,不过没有具体实例,还是不太明白,我的理解大概是这样的吧,

数据帧格式:帧头+数据+类型+校验和+帧尾。
可是在程序中具体该怎么实现,还是一头雾水,收到的数据可以存储到一个字符指针变量中,可是怎么提取有用的数据呢?
[/Quote]
字符协议,和二进制协议!看你是用的是二进制协议,也就是,将信息抽象成二进制,来发送和接受!规定好协议的字节数来处理!
pan0523miao 2011-01-13
  • 打赏
  • 举报
回复
谁能写段代码说明一下
embinuxfans 2011-01-09
  • 打赏
  • 举报
回复
强烈建议使用标准库 bitset

如果采用简单的校验和,就直接把前面所有字节相加丢掉进位,作为校验和字节
lzp150863820 2011-01-09
  • 打赏
  • 举报
回复
自定义通信协议可以模仿一些成熟的通讯规约,比如modbus,cdt等,一般都是确定起始位,地址 ,功能码,数据,校验,结束!
fxq1029 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunny_may 的回复:]
请教各位,我用串口进行通信,可以收发数据正常,不过工程应用中需要确保传输的正确性,所以现在想请教如何规定通信协议,和怎么处理收到的数据?

我查了些资料,不过没有具体实例,还是不太明白,我的理解大概是这样的吧,

数据帧格式:帧头+数据+类型+校验和+帧尾。
可是在程序中具体该怎么实现,还是一头雾水,收到的数据可以存储到一个字符指针变量中,可是怎么提取有用的数据呢?
[/Quote]
我现在和你碰到同样的问题,也是为了确保传输正确性而制定通信协议,一头雾水,我第一次接触这类问题,请问楼主可否赐教?急!
xjq2003 2010-06-18
  • 打赏
  • 举报
回复
数据帧格式:帧头+数据+类型+校验和+帧尾。


比如 帧头0xff+数据0x01+类型0x02+校验和(0x0+0xff+0x01+0x02)+帧尾0xaa。
最后发送的数据就是:ff 01 02 03 aa
s8975565 2010-06-17
  • 打赏
  • 举报
回复
看来这个问题貌似很多人都在研究啊,谢谢了!
BCBPLC 2010-05-27
  • 打赏
  • 举报
回复
反正位中有校验的。协议你可以自已定,两边都是你自已编的,只要能通迅,不歧义;
也可以用现成的标准协议,如MODBUS就是较简单的。
波粒 二象性 2010-05-26
  • 打赏
  • 举报
回复
我现在也在研究协议,费心啊,看过各位的见解稍有领悟,继续期待高手
xjq2003 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 lurenyi 的回复:]
C/C++ code//格式:[STX][ADDRESS][COMMAND][PARA][LONG][ETX]int __fastcall MOD_Encode(const unsignedchar*InBuf,int InLen,unsignedchar*OutBuf,char ADD);

{int OutLen=0;int CheckSum=0;

OutBuf[OutLen]= S¡­
[/Quote]
这是个好例子
nbzip 2009-09-10
  • 打赏
  • 举报
回复
数据帧格式:帧头+数据+类型+校验和+帧尾。
这个就是你的通迅协议的初级啊.

然后你们在定义一下,帧头是几个固定值.帧是几个固定值.然后数据是几位,最后第几位到最后第二位是校验码.

然后程序根据你们双方更同默认的数据约定进行通讯,检验.
xzt427 2009-09-10
  • 打赏
  • 举报
回复
jhgnd



cvcx
lhy 2009-09-09
  • 打赏
  • 举报
回复
比如说0xaa是帧头,0xbb是帧尾,帧头,地址,类型,数据长度,帧尾各一字节,剩下的字节数据。
1帧最长260字节,最短5字节。
lurenyi 2009-09-08
  • 打赏
  • 举报
回复

//格式:[STX][ADDRESS][COMMAND][PARA][LONG][ETX]

int __fastcall MOD_Encode(const unsigned char *InBuf,int InLen,unsigned char *OutBuf,char ADD);

{
int OutLen = 0;
int CheckSum=0;

OutBuf[OutLen] = STX;
OutLen++;
OutBuf[OutLen] = ADD;
OutLen++;
CheckSum = CheckSum ^ ADD;

for (int i = 0; i <= InLen-1; i++)
{

if ((InBuf[i] == DLE) || (InBuf[i] == STX) || (InBuf[i] == ETX))
{
OutBuf[OutLen] = DLE;
OutLen++;
OutBuf[OutLen] = 0xff-InBuf[i];
OutLen++;
}
else
{
OutBuf[OutLen] = InBuf[i];
OutLen++;
}
CheckSum = CheckSum ^ InBuf[i];
}
OutBuf[OutLen] = CheckSum;
OutLen++;
OutBuf[OutLen] = ETX;
OutLen++;

return OutLen;
}
sidney2008 2009-09-02
  • 打赏
  • 举报
回复
我最近也在做这个方面的事,协议在下位机就定好了,我要处理的就上位机把要的数据取出来。新手,边学边做,我也是一头雾水。楼主解决了告诉我一下啊
加载更多回复(17)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧