OpenEdv-开源电子网

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

串口如何用保存数据,并进行判断

[复制链接]

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-8-25 18:50:38 | 显示全部楼层 |阅读模式
5金钱
请教一个问题,我现在给GSM模块发送AT指令,发送后,我需要读取它返回的值,进行分析对错,我是用中断还是查询?
我用查询吧,刚发送完AT指令,我就一直查询,知道接收空。我再把收到的统一发送出去。
我的代码如下:
[mw_shl_code=c,true] while(USART_GetFlagStatus(UART4,USART_FLAG_RXNE)==SET) //检查发送数据寄存器空标志 { Receive[k]=USART_ReceiveData(UART4);//保存数据到缓冲器里 k++; if (USART_FLAG_RXNE==RESET) break; } [/mw_shl_code] [mw_shl_code=c,true] USART_Printf(UART5, Receive);[/mw_shl_code]
我开机后,执行这个循环,然后用串口5发送出去,结果什么数据也收不到。。。
用中断吧,我开始接收到数据,然后要比对,中断需要比对的就多了,包括开机信息,发送各种AT指令返回的信息的比对。。。
用中断不知从何下手!
有人以前做过吗,给点思路。。。

最佳答案

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

回复【4楼】augustedward: --------------------------------- 我知道你的意思,我的流程是这样:1.我先按开机键,然后GSM模块返回给我一串信息。2 发送几个测试指令,每次的返回值不一样。这个我可以设置几个字符数组,然返回值和数组比较。3建立TCP连接 我 的思路是这样的:我利用中断接收,有个缓冲数组bufferReceive[],收到的信息放进bufferReceive[],然后接收信息结束,用bufferReceive[]和我预想的值进行比较。 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-25 18:50:39 | 显示全部楼层
回复【4楼】augustedward:
---------------------------------
我知道你的意思,我的流程是这样:1.我先按开机键,然后GSM模块返回给我一串信息。2 发送几个测试指令,每次的返回值不一样。这个我可以设置几个字符数组,然返回值和数组比较。3建立TCP连接
我 的思路是这样的:我利用中断接收,有个缓冲数组bufferReceive[],收到的信息放进bufferReceive[],然后接收信息结束,用bufferReceive[]和我预想的值进行比较。我设置两个状态机,第一个就是在主程序中的,发送指令用的,另一个状态机是在中断程序里,接收完信息后,比较用,如果正确进行发送,如果不正确,让主程序中的状态回一位,重新发送!这是我昨晚刚想到的。
不知道我这样想对不对?
还有一个我一直没搞明白。
void UART4_IRQHandler(void)
{

if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET) 

    {     
USART_ClearITPendingBit(UART4, USART_IT_TC); 
    USART_SendData(UART5,USART_ReceiveData(UART4));   //缓存COM4中断接收的数据 
 }
 if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
 {
 USART_ClearITPendingBit(UART4, USART_IT_TC); 
 }
}


这个串口中断接收,他是对方发一组字符串中断一次,还是一个字符中断一次,还是遇到一个0x0d 0x0a中断一次?
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12092
金钱
12092
注册时间
2013-3-8
在线时间
1285 小时
发表于 2014-8-25 18:50:39 | 显示全部楼层
回复【5楼】fly0000:
---------------------------------
一个字节中断一次。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12092
金钱
12092
注册时间
2013-3-8
在线时间
1285 小时
发表于 2014-8-25 19:27:01 | 显示全部楼层
定义一个串口协议,用状态机的方式做。
回复

使用道具 举报

19

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2014-8-20
在线时间
0 小时
 楼主| 发表于 2014-8-25 19:41:59 | 显示全部楼层
回复【2楼】augustedward:
---------------------------------
状态机我想过,第一步,接收开机信息。
                     第二步,发送AT,确认工作正常。
                      ......
                     第N步,建立TCP链接。
我主要不知道这中间的数据如何接收。。。用中断,得比较,我不知道怎么比较,因为每一条的比较确认信息又都不一样。


大神,能不能指点一下,思路我能想明白,就是具体做的时候,不知道该如何下手。。。比如我先要收到开机信息,开机信息如下s1:“+ready    call  ready”,这是里面信息,用中断的话,把信息保存在一个缓存中,然后和s1比较正确的话,进入状态机下一条。然后继续执行,返回一个s2,和s2比较。。

我现在不知道中断里面怎么写,我想最乐观的是,每次中断以后,返回一个数组,我用返回的数组和正确的信息进行比较。就是这个地方不知道该如何写。。。
刚我用查询,又收不到任何信息。
我用查询的目的就是,我发送一个AT命令,然后我查询一次,得到结果,然后和正确的信息比对,但是也查询不到,不知道为什么。。。
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12092
金钱
12092
注册时间
2013-3-8
在线时间
1285 小时
发表于 2014-8-26 12:09:12 | 显示全部楼层
回复【3楼】fly0000:
---------------------------------
你发送的东西能不能用串口通讯协议?比如每次发送前四个字节为 0xaa 0x5a 0xa5 0x55  中间为你想要的数据,最后用0x0a,0x0d 结束。这样在中断里你只判断前四个字节与最后两个字节是否正确。正确的话,就取中间数据用状态机处理。不正确就清零,重新从0xaa..开始判断。
不知道我说的你明白不?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-2 06:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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