amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 13

求指点,STC15W204S串口接收字符串比较的问题

[复制链接]
(8475860)

打赏出0元收入0元

发表于 2020-4-5 18:21:07 | 显示全部楼层 |阅读模式
本帖最后由 qinyuming452 于 2020-4-5 18:23 编辑

大佬,纯新手求指导一下,
怎样接收到指定的字符串的后,
进行比较是否接收到正解的字符串呢?
比较到正确的字符串后,再去实行其它指令?

现在只理解到发送一个字符,但发送到一组字符串后不懂得应该怎样去比较了
(8473941)

打赏出0元收入0元

发表于 2020-4-5 18:53:06 | 显示全部楼层
每收到一个字节就存到环形缓冲区,
然后比较最近N个字符是不是要的字符串
(8472316)

打赏出0元收入0元

 楼主| 发表于 2020-4-5 19:20:11 | 显示全部楼层
Himem 发表于 2020-4-5 18:53
每收到一个字节就存到环形缓冲区,
然后比较最近N个字符是不是要的字符串 ...

卡在比较的这个地方了,
unsigned char RxdByte;//串口接收到的数据
unsigned char RxdBytebut[] = {'S','T','A','R','T'};//START

void UART1_Interrupt(void) interrupt 4
{
        if(RI)
                {
                        RI = 0;
                        RxdByte = SBUF;
                        //SBUF = RxdByte;
                        if( strcmp (RxdByte,RxdBytebut) == 0)
                        //if(RxdByte == RxdBytebut)
                        {
                                delay_ms(5);
                                hold = 1;
                                delay_ms(5);
                                SBUF = RxdByte;
                                TI=0;
                        }
                               
                }
(8470805)

打赏出0元收入0元

发表于 2020-4-5 19:45:22 | 显示全部楼层
不用环形缓冲区的话, 基本思路就是这样了:
char RxBuf[5];
……
memmove(RxBuf, RxBuf+1, 4);
RxBuf[4] = SBUF;
if (!memcmp(RxBuf, "START", 5)) {
    // *started*
}
(8470206)

打赏出0元收入0元

 楼主| 发表于 2020-4-5 19:55:21 | 显示全部楼层
Himem 发表于 2020-4-5 19:45
不用环形缓冲区的话, 基本思路就是这样了:
char RxBuf[5];
……

谢谢,我试试着去理解一下这个,
另外如果使用环形缓冲的话,
又应该如何编写!
(8335151)

打赏出0元收入0元

发表于 2020-4-7 09:26:16 | 显示全部楼层
1.如果有结束码(如结尾有0x0D 0x0A),
数据可先放入数组,收到结束码后再用strcmp 之类的函数或自己写个比较程序去比较.
我用过这种方法:https://www.amobbs.com/thread-5727495-1-1.html
2.如果没有结束码,字符串位置不确定,
状态机了解一下:
http://m.elecfans.com/article/903889.html
(8334377)

打赏出0元收入0元

 楼主| 发表于 2020-4-7 09:39:10 | 显示全部楼层
lcw_swust 发表于 2020-4-7 09:26
1.如果有结束码(如结尾有0x0D 0x0A),
数据可先放入数组,收到结束码后再用strcmp 之类的函数或自己写个比较 ...

已收藏,学习,谢谢。
(8334082)

打赏出0元收入1元

发表于 2020-4-7 09:44:05 | 显示全部楼层
首先得有起始码和结束码,另外别在串口中断里直接比较字符。
(8303708)

打赏出0元收入0元

发表于 2020-4-7 18:10:19 | 显示全部楼层
具体距离:
定义一个字符串:u8 code CMD1[]="Return Message";
接收计数器:rx_cnt;
每收到一个字节,进串口中断,判断字符是否正确,正确则rx_cnt+1,并判断是否字符接收完毕,不正确将rx_cnt=0;
这样处理,不会影响串口原有的程序。
(8206901)

打赏出0元收入0元

 楼主| 发表于 2020-4-8 21:03:46 | 显示全部楼层
饭桶 发表于 2020-4-7 09:44
首先得有起始码和结束码,另外别在串口中断里直接比较字符。

假如要比较的是接收一组长度不一的16进制的数据,
3A XX XX XX XX XX 0D 0A
3A是固定起始码,0D 0A是结束码,
这样的话不在串口中断中直接比较的话,
后继应该如何编写?
然后返回发送的话固定的起始码是A3,
结束码还依然是0D 0A
(8206851)

打赏出0元收入0元

 楼主| 发表于 2020-4-8 21:04:36 | 显示全部楼层
小李非刀 发表于 2020-4-7 18:10
具体距离:
定义一个字符串:u8 code CMD1[]="Return Message";
接收计数器:rx_cnt;

感谢指导!我再多去学习学习
(8187464)

打赏出0元收入0元

发表于 2020-4-9 02:27:43 | 显示全部楼层
本帖最后由 jinlei6394 于 2020-4-9 02:30 编辑

环形容器如果觉得写着比较麻烦,只需要一个buf就好了,但要记得每次读完要把没读的部分抄到开头。
以TCP的习惯做法一般是把内容封包,长度+hash+内容,这样做可以近乎100%保证内容正确。当然,他不能纠正,只能校验。
代价是发送的信息需要打包,且每个包多几个字节。在这个应用下,长度一个char即可,hash可使用crc8,也是一个字节。
如果需要纠正,则需要实现重发机制,很麻烦。大多数通信都是脉冲性质的,一般丢几个包也问题不大;如果是遇到特别重要的,可以考虑多发几遍。
(8122240)

打赏出0元收入0元

 楼主| 发表于 2020-4-9 20:34:47 | 显示全部楼层
jinlei6394 发表于 2020-4-9 02:27
环形容器如果觉得写着比较麻烦,只需要一个buf就好了,但要记得每次读完要把没读的部分抄到开头。
以TCP的 ...

感谢指导!学习学习
(7707815)

打赏出0元收入0元

发表于 2020-4-14 15:41:52 | 显示全部楼层
不要将延时放在中断内,看看STC的例程。
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-12 20:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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