打印

串口通信

[复制链接]
2686|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
栩栩如生|  楼主 | 2012-4-8 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
与终端进行串口通信,终端一有动作就会一直向MCU发送10个字节一组的AA 73 XX XX XX XX CC 33 C3 3C数据,动作结束后发送AA 72 XX XX XX XX CC 33 C3 3C数据,而MCU要进行处理和有用的数据就是最后的这组,可以用C语言的什么语句结构来判断串口已经收到这组数据呢?
沙发
司徒老鹰| | 2012-4-8 17:41 | 只看该作者
据第二个字节的0x73和0x72不就可以判断。比如10个字节都存到一个uchar msg[10]中,

if  (0x72== msg[1])
{
       // data processing
       .....
}
else
{
        // do nothing?
}

更严格的判决是不是有效的要处理的消息,可以加上前面的AA,以及后面的CC 33 C3 3C.

使用特权

评论回复
板凳
yufe| | 2012-4-8 17:42 | 只看该作者
我刚开始也是这么考虑的。。但是终端一开始动作每隔100MS就发送AA,73的数据组至到动作结束才发送AA,72数据组,不可能只判断接收数据的缓冲区的前10个字节就是有效的

使用特权

评论回复
地板
司徒老鹰| | 2012-4-8 17:42 | 只看该作者
串口接收的数据只有这固定的两组吗?会不会有垃圾数据插到中间? 比如插入垃圾数据YY:
AA 73 XX XX XX XX CC 33 3C C3,  YY .. ,  AA 72 XX XX XX XX CC 33 3C C3.

可以用类似状态机切换的方法去读缓冲区的数据。

使用特权

评论回复
5
栩栩如生|  楼主 | 2012-4-8 17:44 | 只看该作者
终端发送的数据都是以AA开头,后面的7X代表不同的功能然后以AA 72为结束组数据,你建议的状态机切换方法我没接触过。。我现在还是菜鸟阶段

使用特权

评论回复
6
llljh| | 2012-4-8 17:44 | 只看该作者
终端每次串口通信都可以接收进来,  保存在10字节数组里.
接收完成后马上判断一下第二个数据是不是"72H", 是就把数据另外存起来并处理;
不是的话就准备继续接收, 接收的数据还放在那个数组里(覆盖掉刚才的信息)...
自始至终只用一个数组做数据接收缓存...

2楼应该也是这个意思吧...

使用特权

评论回复
7
chuxh| | 2012-4-8 17:46 | 只看该作者
收一组数,然后判断,然后清零!

然后再收下一组....

使用特权

评论回复
8
houcs| | 2012-4-8 17:47 | 只看该作者
收到AA 73以后再连收8个数据,如果8个数据的后4个不等于CC 33 C3 3C则丢弃所有数据,再重新开始接收
...
简单的状态机就搞定了

使用特权

评论回复
9
liuzaiy| | 2012-4-8 17:48 | 只看该作者
还是状态机更为简单、可靠。
不过应该改为:
“如果8个数据的后4个不等于CC 33 C3 3C则移动指针,从下一位置开始搜索AA 73”

使用特权

评论回复
10
yinxiangh| | 2012-4-8 17:49 | 只看该作者
有没有考虑到如果数据中出现 AA 73 或 AA 72 之类的数据。
例如下面这组数据将如何判断:
AA 73 XX XX AA 73  CC 33 C3 3C CC 33 C3 3C
AA 73 XX XX XX XX CC 33 C3 3C
                    AA 73 XX XX XX XX CC 33 C3 3C

使用特权

评论回复
11
pangb| | 2012-4-8 17:51 | 只看该作者
1.发生在AA后面的错误都要从AA后面的字节开始重新搜索AA 73
2.AA 73后面的任何错误,都要再从紧跟AA73后的第一个XX开始重新搜索。

使用特权

评论回复
12
chenjunt| | 2012-4-8 17:51 | 只看该作者
以AA为头,最后以连续CC 33 C3 3C 为结尾

使用特权

评论回复
13
ousj| | 2012-4-8 17:53 | 只看该作者
这是LZ自己定义的?!
这规约不好,加个校验吧。

使用特权

评论回复
14
morrisk| | 2012-4-8 17:53 | 只看该作者
本帖最后由 morrisk 于 2012-4-8 17:57 编辑

必须判:
if( (0xaa== msg[0]) &&
    (0x72== msg[1]) &&
    (0xcc== msg[6]) &&
    (0x33== msg[7]) &&
    (0xc3== msg[8]) &&
    (0x3c== msg[9]))
{
}
else if( (0xaa== msg[0]) &&
           (0x72== msg[1]) &&
           (0xcc== msg[6]) &&
           (0x33== msg[7]) &&
           (0xc3== msg[8]) &&
           (0x3c== msg[9]))
{
}

使用特权

评论回复
15
栩栩如生|  楼主 | 2012-4-8 17:55 | 只看该作者
好的,我知道了

使用特权

评论回复
16
栩栩如生|  楼主 | 2012-4-8 17:56 | 只看该作者
先结贴了

使用特权

评论回复
17
yesful| | 2012-4-9 15:22 | 只看该作者
建议将接收缓冲区定大一点,如uchar msg[20];
当接收的数据头或尾存在着垃圾数据时,比如插入垃圾数据YY:
YY YY YY AA 73 XX XX AA 73  CC 33 C3 3C
AA 73 XX XX XX XX CC 33 C3 3C YY YY YY
YY YY YY   AA 73 XX XX XX XX CC 33 C3 3C YY YY YY
for (i=0;i<RxNum;i++)
{
        if( (0xaa== msg[0+i]) &&
            (0x72== msg[1+i]) &&
            (0xcc== msg[6+i]) &&
            (0x33== msg[7+i]) &&
            (0xc3== msg[8+i]) &&
            (0x3c== msg[9+i]))
         {

          }
          else if( (0xaa== msg[0+i]) &&
           (0x72== msg[1+i]) &&
           (0xcc== msg[6+i]) &&
           (0x33== msg[7+i]) &&
           (0xc3== msg[8+i]) &&
           (0x3c== msg[9+i]))
          {

          }
          RxNum = 0;
}
还可以加一些限制,如RxNum>=10等~~~

使用特权

评论回复
18
yesful| | 2012-4-9 15:22 | 只看该作者
建议将接收缓冲区定大一点,如uchar msg[20];
当接收的数据头或尾存在着垃圾数据时,比如插入垃圾数据YY:
YY YY YY AA 73 XX XX AA 73  CC 33 C3 3C
AA 73 XX XX XX XX CC 33 C3 3C YY YY YY
YY YY YY   AA 73 XX XX XX XX CC 33 C3 3C YY YY YY
for (i=0;i<RxNum;i++)
{
        if( (0xaa== msg[0+i]) &&
            (0x72== msg[1+i]) &&
            (0xcc== msg[6+i]) &&
            (0x33== msg[7+i]) &&
            (0xc3== msg[8+i]) &&
            (0x3c== msg[9+i]))
         {

          }
          else if( (0xaa== msg[0+i]) &&
           (0x72== msg[1+i]) &&
           (0xcc== msg[6+i]) &&
           (0x33== msg[7+i]) &&
           (0xc3== msg[8+i]) &&
           (0x3c== msg[9+i]))
          {

          }
          RxNum = 0;
}
还可以加一些限制,如RxNum>=10等~~~

使用特权

评论回复
19
yesful| | 2012-4-9 15:23 | 只看该作者
建议将接收缓冲区定大一点,如uchar msg[20];
当接收的数据头或尾存在着垃圾数据时,比如插入垃圾数据YY:
YY YY YY AA 73 XX XX AA 73  CC 33 C3 3C
AA 73 XX XX XX XX CC 33 C3 3C YY YY YY
YY YY YY   AA 73 XX XX XX XX CC 33 C3 3C YY YY YY
for (i=0;i<RxNum;i++)
{
        if( (0xaa== msg[0+i]) &&
            (0x72== msg[1+i]) &&
            (0xcc== msg[6+i]) &&
            (0x33== msg[7+i]) &&
            (0xc3== msg[8+i]) &&
            (0x3c== msg[9+i]))
         {

          }
          else if( (0xaa== msg[0+i]) &&
           (0x72== msg[1+i]) &&
           (0xcc== msg[6+i]) &&
           (0x33== msg[7+i]) &&
           (0xc3== msg[8+i]) &&
           (0x3c== msg[9+i]))
          {

          }
          RxNum = 0;
}
还可以加一些限制,如RxNum>=10等~~~

使用特权

评论回复
20
yesful| | 2012-4-9 15:24 | 只看该作者
:Q晕,点了没反应,以为没发成功~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

310

主题

2657

帖子

0

粉丝