[其他ST产品]

为什么总觉得串口的接收比发送难

[复制链接]
848|12
手机看帖
扫描二维码
随时随地手机跟帖
mutable|  楼主 | 2021-11-16 13:10 | 显示全部楼层 |阅读模式
所有的例程都是串口发送
或者简单的收发测试
看例程,都没问题,

可是,一到自己写串口接收,总是有这样或者那样的问题,
串口可以说是最基本的应用了,
大神们都是怎么写接收的,这个能搞成通用的形式么

使用特权

评论回复
zchong| | 2021-11-16 21:39 | 显示全部楼层
具体问题具体分析,嵌入式的魅力就是不通用,

使用特权

评论回复
小叶三千| | 2021-11-18 09:56 | 显示全部楼层
这个哪有通用形式的,根据功能去自己完善,有按字节接收的,有按字段去接收的

使用特权

评论回复
sundea| | 2021-11-19 09:38 | 显示全部楼层
你要的通用的
/****************************************************************************
* 名   称:void USART1_IRQHandler(void)
* 功   能:中断机制
* 入口参数:无
* 出口参数:无
* 说   明:接收到的数据存入接收缓冲区
     USART_GetITStatus      检查指定的USART中断发生与否
     USART_GetFlagStatus    检查指定的USART标志位设置与否
****************************************************************************/
void USART1_IRQHandler(void)
{
    unsigned char i;
    unsigned char USART1_GetChar;
   
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)                                        // 串口接收数据触发中断
        {
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);                                        //清空接收中断标志
                USART1_GetChar = USART_ReceiveData(USART1);                                                //接收到的字符数据
                if(USART1_GetChar==0xA)                                         //接收到LF结束符(\n)
                {
                }
        else if(USART1_GetChar == '$')
        {
            USARTStructure1.RX_TMEP_Len = 0;
            USARTStructure1.RX_TEMP_BUFF[USARTStructure1.RX_TMEP_Len] = USART1_GetChar;
                        USARTStructure1.RX_TMEP_Len++;
        }
                else if(USART1_GetChar==0xD)                                    //接收到CR结束符(\r)
                {
                        if(USARTStructure1.RX_TMEP_Len > 2)                         //检测长度
                        {
                                for(i = 0 ;i<USARTStructure1.RX_TMEP_Len; i++ )         //拷贝字符串
                                {
                                                USARTStructure1.RX_BUFF[i]=USARTStructure1.RX_TEMP_BUFF[i];
                                }
                                USARTStructure1.RX_BUFF[i] = '\0';                      //结尾加 "\0"
                                USARTStructure1.RX_Len = USARTStructure1.RX_TMEP_Len;   //获取长度
                                USARTStructure1.RX_TMEP_Len = 0;                        //临时变量指向数组的首位
                                USARTStructure1.RX_Flag=1;                              //接收完成标志位
                        }
            else
            {
                USARTStructure1.RX_BUFF[0] = '\0';                      //误触发,不处理,清空字符串
                                USARTStructure1.RX_Len = USARTStructure1.RX_TMEP_Len;
                                USARTStructure1.RX_TMEP_Len = 0;
                                USARTStructure1.RX_Flag=1;
            }
                }
        else
                {
                        USARTStructure1.RX_TEMP_BUFF[USARTStructure1.RX_TMEP_Len] = USART1_GetChar;
                        USARTStructure1.RX_TMEP_Len++;
                }  
        }

        else if(USART_GetFlagStatus(USART1, USART_IT_ORE) == SET)                    //检测是否有接收溢出
    {
            USART_ReceiveData(USART1);                                                                            //清接收溢出标志,只能用读数据的方式来清溢出标志
    }

        else if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)                                //串口发送数据触发中断
        {
                ;
        }
}

使用特权

评论回复
sundea| | 2021-11-19 09:39 | 显示全部楼层
多看看和分析为啥我是这样写的吧

使用特权

评论回复
nawu| | 2021-12-10 11:53 | 显示全部楼层
我就没有这种赶脚啊

使用特权

评论回复
qcliu| | 2021-12-10 11:55 | 显示全部楼层
因为发送是一个单片机的事儿 接收是两个单片机的事儿

使用特权

评论回复
tfqi| | 2021-12-10 12:09 | 显示全部楼层
这个就是配合的问题了

使用特权

评论回复
wiba| | 2021-12-10 12:10 | 显示全部楼层
各种匹配啦

使用特权

评论回复
zljiu| | 2021-12-10 12:39 | 显示全部楼层
分析的比较到位

使用特权

评论回复
foxsbig| | 2021-12-10 14:19 | 显示全部楼层
sundea 发表于 2021-11-19 09:39
多看看和分析为啥我是这样写的吧

不错的分享,
其实,想通用接收的话,需要标准层级或者单位层级的去统一
行业统一,比如一些固定的标准协议
单位内部统一,自己定协议,内部通讯,自行遵守

使用特权

评论回复
评论
sundea 2021-12-13 09:12 回复TA
一般每家公司都是有自己定义的协议的 
lu50211| | 2021-12-13 09:44 | 显示全部楼层
接收可以搞个环形的,具体内容按协议解析出来,

使用特权

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

本版积分规则

72

主题

598

帖子

0

粉丝