[STM8] 请教和讨论关于STM8L串口接收字符串的问题:数据接收不完整

[复制链接]
13128|31
 楼主| 摩捏 发表于 2015-4-15 09:23 | 显示全部楼层
我同意大家的看法。昨晚回家里试,只是使能接收中断,无错误中断。中断函数里面只判断接收中断。无再发现漏接。 早上回公司重做昨晚的操作,无数据丢失。贴上修改后的代码。

已经调试了两天,一开始就是接收数据到数组,发现不能成功,然后试各种方法。甚至数组不输出,直接ST-LINK里面直接观察数组也尝试。如今真是无语。可能是太疲惫了,以致犯些小错误吧。谢谢各位的支持,楼上各位。


void usart_init(void)
{
        //set tx as output
        GPIO_Init(GPIOC,GPIO_Pin_3,GPIO_Mode_Out_PP_High_Fast);
        //set rx as input.
        GPIO_Init(GPIOC,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT);        
          USART_DeInit(USART1);
        USART_Init(USART1, 9600, USART_WordLength_8b, USART_StopBits_1,\
                USART_Parity_No,USART_Mode_Rx|USART_Mode_Tx);
       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        //USART_ITConfig(USART1, USART_IT_ERR, ENABLE);
       
        USART_Cmd(USART1, ENABLE);
        enableInterrupts();
        printf("Hello world!");
}


INTERRUPT_HANDLER(USART1_RX_IRQHandler,28)
{
        usart_receive_strings();
}



void usart_receive_strings(void)
{               
        unsigned char usart_data=0;
        if(USART_GetITStatus(USART1,  USART_IT_RXNE))
        {
                usart_data=USART_ReceiveData8(USART1);
                if(usart_receive_num<30)
                        usart_receive_buf[usart_receive_num++]=usart_data;
        }
}
 楼主| 摩捏 发表于 2015-4-15 09:24 | 显示全部楼层
测试的结果。
QQ图片20150415092340.jpg
joyme 发表于 2015-4-15 10:37 | 显示全部楼层
没啥邪门,在中断里调用发送成功,连续接收有问题很正常,实际项目里用这种方式会很不可靠,应该用缓冲
 楼主| 摩捏 发表于 2015-4-15 11:59 | 显示全部楼层
joyme 发表于 2015-4-15 10:37
没啥邪门,在中断里调用发送成功,连续接收有问题很正常,实际项目里用这种方式会很不可靠,应该用缓冲 ...

恩,赞陈。 你看完我的描述。中断调用发送,是后面添加的。之前也用数组缓存。或许真忽略了什么细节吧。
一从陶令 发表于 2015-4-15 14:37 | 显示全部楼层
串口的问题单纯集中在如何清寄存器之类的配置上,不足以构建一个可靠的程序。大体而言,要让通信过程比较稳定,你需要从如下几个方面进行研究:

1、发送端的发送协议如何定义?好的协议通常会指出帧头特征字、帧长度、接收设备地址、接收设备寄存器地址、帧内容、校验字节、帧尾特征字等,这些不同的部分便于下游接收方分辨出帧的开始、接收者ID、帧长度、如何校验等。

2、接收方根据协议进行相应的识别,只有在前一部分识别出来的情况下,才会进行后一部分内容的识别。根据识别的程度,会有相应的回送告知发送方通信过程的结果。

3、接收中断中只进行数据的转存,一般不进行运算。即便这样,设计者也要仔细考虑是否有更高优先级的任务会打断这个过程,同时要确保第二个字节中断到来前,第一个字节中断一定处理完了。

4、对接收内容的判断、处理应分层进行,传输层通常解决帧头识别、帧字节数量的问题,确保接收内容完整;数据链路层通常进行校验比对,确保数据内容正确无错码;应用层对接收的数据进行合理性分析,以识别发送方是否出现故障。一般来说,在接收中断中进行传输层处理、在其他任务中进行数据链路层和应用层处理。

5、物理层的设计是要通过硬件电路或配置寄存器来实现的,比如对差分信号进行适当的电平配置和终结匹配,又比如采用偶校验会更加抗干扰,采用屏蔽电缆减少辐射干扰等等。以上种种方法确保物理层的电平或电流移动在设计的范围之类。

6、对某些半双工的通信过程,还要考虑收发之间的时间间隔、帧与帧之间的间隔、字节与字节的间隔,推荐了解下MODBUS协议的定义。如果接收端的实时响应能力不高,还要充分考虑它的最大延时。

7、数据的发起方称之为产生,数据的接收方称之为终结。在产生和终结之间,形成了一个数据段。我们利用帧头帧尾判断数据内容是否完整、利用校验字判断数据内容是否正确,这些额外的(非内容的)字节称之为开销,开销字节维护了一个数据段的完整性,而完整性就是实现一次可靠通信的基本过程。

供参考。
RF、龙龙 发表于 2016-4-25 15:43 | 显示全部楼层
楼主的问题解决了吗    我也碰到这样的问题不知道该怎解决
RF、龙龙 发表于 2016-4-25 16:14 | 显示全部楼层
楼主的问题解决了吗    我最近也碰到这样的问题   能帮我分析分析吗   谢了
hktk7 发表于 2016-11-23 09:42 | 显示全部楼层
楼主,我也遇到了接收不全的问题,能分享一下解决方案吗??
 楼主| 摩捏 发表于 2016-12-7 17:13 | 显示全部楼层
hktk7 发表于 2016-11-23 09:42
楼主,我也遇到了接收不全的问题,能分享一下解决方案吗??

实在是不好意思,那时项目忙没继续上论坛。后来的解决办法也是莫名其妙。印象中是清终端标识的先后。仅供参考。
 楼主| 摩捏 发表于 2016-12-7 17:14 | 显示全部楼层
RF、龙龙 发表于 2016-4-25 16:14
楼主的问题解决了吗    我最近也碰到这样的问题   能帮我分析分析吗   谢了

实在是不好意思,那时项目忙没继续上论坛。后来的解决办法也是莫名其妙。印象中是清终端标识的先后。仅供参考。

过些时候才有时间把代码翻出来看,实在是抱歉。
alexwang5678 发表于 2017-7-26 18:27 | 显示全部楼层
qunengguang 发表于 2018-8-16 15:16 | 显示全部楼层
你最后是怎么解决的? 我遇到类似的问题  用串口工具发送单个自己正常 发送字符就接收不到!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部