发新帖我要提问
12
返回列表
打印
[STM8]

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

[复制链接]
楼主: 摩捏
手机看帖
扫描二维码
随时随地手机跟帖
21
摩捏|  楼主 | 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;
        }
}

使用特权

评论回复
22
摩捏|  楼主 | 2015-4-15 09:24 | 只看该作者
测试的结果。

QQ图片20150415092340.jpg (54.17 KB )

QQ图片20150415092340.jpg

使用特权

评论回复
23
joyme| | 2015-4-15 10:37 | 只看该作者
没啥邪门,在中断里调用发送成功,连续接收有问题很正常,实际项目里用这种方式会很不可靠,应该用缓冲

使用特权

评论回复
24
摩捏|  楼主 | 2015-4-15 11:59 | 只看该作者
joyme 发表于 2015-4-15 10:37
没啥邪门,在中断里调用发送成功,连续接收有问题很正常,实际项目里用这种方式会很不可靠,应该用缓冲 ...

恩,赞陈。 你看完我的描述。中断调用发送,是后面添加的。之前也用数组缓存。或许真忽略了什么细节吧。

使用特权

评论回复
25
一从陶令| | 2015-4-15 14:37 | 只看该作者
串口的问题单纯集中在如何清寄存器之类的配置上,不足以构建一个可靠的程序。大体而言,要让通信过程比较稳定,你需要从如下几个方面进行研究:

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

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

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

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

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

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

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

供参考。

使用特权

评论回复
26
RF、龙龙| | 2016-4-25 15:43 | 只看该作者
楼主的问题解决了吗    我也碰到这样的问题不知道该怎解决

使用特权

评论回复
27
RF、龙龙| | 2016-4-25 16:14 | 只看该作者
楼主的问题解决了吗    我最近也碰到这样的问题   能帮我分析分析吗   谢了

使用特权

评论回复
28
hktk7| | 2016-11-23 09:42 | 只看该作者
楼主,我也遇到了接收不全的问题,能分享一下解决方案吗??

使用特权

评论回复
29
摩捏|  楼主 | 2016-12-7 17:13 | 只看该作者
hktk7 发表于 2016-11-23 09:42
楼主,我也遇到了接收不全的问题,能分享一下解决方案吗??

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

使用特权

评论回复
30
摩捏|  楼主 | 2016-12-7 17:14 | 只看该作者
RF、龙龙 发表于 2016-4-25 16:14
楼主的问题解决了吗    我最近也碰到这样的问题   能帮我分析分析吗   谢了

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

过些时候才有时间把代码翻出来看,实在是抱歉。

使用特权

评论回复
31
alexwang5678| | 2017-7-26 18:27 | 只看该作者

使用特权

评论回复
32
qunengguang| | 2018-8-16 15:16 | 只看该作者
你最后是怎么解决的? 我遇到类似的问题  用串口工具发送单个自己正常 发送字符就接收不到!!!

使用特权

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

本版积分规则