OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5278|回复: 7

简单串口处理程序,大家如何写,个人自学不知道这种合理么 求指导

[复制链接]

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2020-5-28
在线时间
57 小时
发表于 2021-4-19 16:44:58 | 显示全部楼层 |阅读模式
30金钱
原子哥的程序里  串口收到数据直接放进数组里  我就拿出来用,然后对比做选择之后确定一个功能位,然后在里面放标志位 ,最后处理标志位里面输出动作什么的。这种逻辑怎么样 ,我想知道大家都是怎么写这个的,各位有没有简单工程的 源码让小弟学学  ,自己学着  见识太少了。 int main(void)
{               
        u16 t;  
        u16 len;       
        u16 times=0;
        u16 i=0;
        u8 flag;
        delay_init();            
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);         
        LED_Init();                            
        KEY_Init();         
        while(1)
        {
                ////////////////////////////////////////////////////////////////////////////////////////
                if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;
                        for(t=0;t<len;t++)
                        {                
                                     /*这里判断下传过来的数据 是不是想要的,格式正确就返回值*/
                                if( USART_RX_BUF[0]==0x55 && USART_RX_BUF[len-1]==0x68 && USART_RX_BUF[len-2]==USART_RX_BUF[1]+USART_RX_BUF[2]+USART_RX_BUF[3])
                                {
                                                if(USART_RX_BUF[1]==1)        //这里判断其中一个位置来判断功能位,                                        
                                                {
                                                        USART_SendData(USART1, USART_RX_BUF[t]);
                                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                                                        LED0=1;
                                                        flag=1;                       //是标志位的话,就给个值,让下面程序继续处理     
                                                }
                                               
                                                else if(USART_RX_BUF[1]==2)          //       
                                                {
                                                        USART_SendData(USART1, USART_RX_BUF[t]);
                                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                                                        LED0=0;
                                                }
                                }
                        }
                        USART_RX_STA=0;
                }
               
                ////////处理标志位////////////////////////
                if(flag==1)
                {
                        flag=0;
                        LED1=!LED1;
                        delay_ms(100);
                        LED1=!LED1;
                        delay_ms(100);
                        LED1=!LED1;
               
                                                         USART_SendData(USART1,0x65);
                                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                                                        USART_SendData(USART1, 0xef);
                                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                                                        USART_SendData(USART1, 0xff);
                                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                                                        USART_SendData(USART1, 0x87);
                                                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                }
                /////////////////////////////////////////////////////////////////
        }         
}


最佳答案

查看完整内容[请看2#楼]

基本流程: 串口中断->串口数据流->拷贝到FIFO->退出中断->应用(main)从FIFO取出数据解析、处理。 参考: https://acuity.blog.csdn.net/article/details/108367512
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2021-4-19 16:44:59 | 显示全部楼层
基本流程:
串口中断->串口数据流->拷贝到FIFO->退出中断->应用(main)从FIFO取出数据解析、处理。
参考:
https://acuity.blog.csdn.net/article/details/108367512
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13102
金钱
13102
注册时间
2012-11-26
在线时间
3811 小时
发表于 2021-4-19 16:58:34 | 显示全部楼层
一般都是定一个协议的,然后在中断里根据协议状态,最终判断是不是收到一帧。带RTOS的话,就把这一帧丢给任务去处理。裸机的话,处理逻辑不长,可以在中断里处理,逻辑比较臃肿,就丢给main处理
回复

使用道具 举报

6

主题

890

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1481
金钱
1481
注册时间
2020-8-19
在线时间
336 小时
发表于 2021-4-19 17:11:07 | 显示全部楼层
简单的就是用STRSTR函数来和数据进行对比,然后用条件判断来执行某个对应的函数即可
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-4-19 18:33:08 | 显示全部楼层
发送时就不用管接收?
回复

使用道具 举报

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2020-5-28
在线时间
57 小时
 楼主| 发表于 2021-4-20 08:36:34 | 显示全部楼层
edmund1234 发表于 2021-4-19 18:33
发送时就不用管接收?

确实我这个发送函数只是复制过来的,还不太能理解,我这个是用到了发送完成中断了么,这样会导致冲突么,网上说不加下面那句while循环会丢第一个字节。自己试也是这样。我应该怎样去 管呢
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2020-10-22
在线时间
16 小时
发表于 2021-4-20 09:11:00 | 显示全部楼层
一般为了确保通讯健壮性都会自订协议,然后做一个报文校验来判断是否有丢数据。简单的互相通讯应该都会规定一个通讯间隔来确保收发不会同时发生,这个好像485里面半双工就是这么用的。如果想要实现全双工,那感觉可以用数据帧pop和push的思路去实现,应该可以规避冲突。
回复

使用道具 举报

32

主题

236

帖子

0

精华

高级会员

Rank: 4

积分
993
金钱
993
注册时间
2017-8-11
在线时间
137 小时
发表于 2021-4-21 08:51:22 | 显示全部楼层
2楼说得对,简单就是,你这种做法一般就是协议判定的过程,逻辑简单的话,会在串口接收中断里面判定当个字节或者一段数组,生成状态机,或者直接处理了。而如果逻辑多的话,直接在main上 ,通过状态机,去做动作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 02:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表