[原创] 关于串口通信中的数据结构传递!

wuyanyanke   2012-1-4 01:56 楼主
考虑一个问题呵!
就是说我想从MSP430里面传送一个Struct数据到PC或别的芯片,这个方式应该怎么组织呢!

因为MSP430 是一个字节一个字的传的,一般来说是先分一个临时的数组,然后往数组里填数据,然后再整个数据的操作,
但是这个过程中怎么去处理一组数据的开始和结尾呢!比如说我把所有的数据都一直往数组里放,那就一锅粥了,怎么去定义一个开始和结尾!?

大家有什么方案说出来一块讨论一下!?说不定哪天就用到了!

回复评论 (7)

一点拙见

数据结构是针对C语言的,C语言没有处理串口的专用编译方法。所以我想只能自己写程序处理数据结构的串口输出,比如用指针把结构中的数据逐项送给串口。接受端接收后,再恢复成原数据结构。
点赞  2012-1-4 09:31
规定好帧格式
如果是定长的帧就很好办,比如两个字节,你收到了两个字节就可以认为是收到了一个完整的帧;要是觉得这样可靠性太低,可以设置帧头和帧尾,来判断帧。比如这样的格式{0x55,……,0xaa}
点赞  2012-1-4 09:35

引用: 原帖由 wstt 于 2012-1-4 09:35 发表 规定好帧格式如果是定长的帧就很好办,比如两个字节,你收到了两个字节就可以认为是收到了一个完整的帧;要是觉得这样可靠性太低,可以设置帧头和帧尾,来判断帧。比如这样的格式{0x55,……,0xaa}

 

同意,再加上进行校验和吧。可以参考一下GA/T508-2004:

https://bbs.eeworld.com.cn/viewthread.php?tid=309162&page=1&fromuid=194149#pid1213391

点赞  2012-1-4 10:05
你的问题其实就是如何定义一个完整合理的数据帧格式,我讲下我们一般用的格式供你参考。
1. 除非对数据帧长度有限制,一般会使用0X55或者0XAA作为同步字,可以是一字节也可以是2个字节。这个同步字在一般情况下用处不是很大,接收方可以通过该同步字来划分收到的各个数据帧段。但在有的情况下,该同步字就比较有意义了。比如,对方是自适应波特率的应用,加上这个同步字就能很方便地实现自适应波特率的功能。
2. 我们在同步字后跟一个字节的帧头,用来判断帧的起始地址,
3. 除非是固定帧长的应用,我们会在帧的起始位置加一个帧长度,这个也是根据你的应用来确定是用一个字节还是2个字节.
4. 接下来是有效数据帧,根据实际情况确定。
5. 数据帧后,我们一般会跟1-2个字节的校验字,可以是校验和,也可以是CRC。根据你的应用确定。
5. 校验字之后,会有一个字节的帧结束标志。
点赞  2012-1-4 10:10

回复 楼主 wuyanyanke 的帖子

先定义好帧的模式,包括帧头,帧尾,数据区,比如0xaa,0xd5  data0 data1 data2...datan  0xbb,这样发送和接收都能够得到有效识别。
点赞  2012-1-4 10:24
谢谢各位,

我现在遇到一个问题,就是不知道为什么从另一个模块里传进来的数据只能读出来8个字节!?
代码如下:

#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
  switch(__even_in_range(UCA1IV,4))
  {
  case 0:break;                             // Vector 0 - no interrupt

  case 2:                                   // Vector 2 - RXIFG
    RxLen++;
    RxBuffer[RX_IndexW] =UCA1RXBUF;
    if(++RX_IndexW > 128)
    {
      RX_IndexW = 0;
    }
    break;
  case 4:                                   // Vector 4 - TXIFG
    break;
  default: break;
  }
}

求解!?
点赞  2012-1-4 14:30
如果是串口通信的话,规定好相关的通信协议,规定好帧长,把数据一帧一帧的发送和接收。检测到帧头就开始读数据
点赞  2012-1-4 21:58
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复