qinyuming452 发表于 2020-4-5 18:21:07

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

本帖最后由 qinyuming452 于 2020-4-5 18:23 编辑

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

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

Himem 发表于 2020-4-5 18:53:06

每收到一个字节就存到环形缓冲区,
然后比较最近N个字符是不是要的字符串

qinyuming452 发表于 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;
                        }
                               
                }

Himem 发表于 2020-4-5 19:45:22

不用环形缓冲区的话, 基本思路就是这样了:
char RxBuf;
……
memmove(RxBuf, RxBuf+1, 4);
RxBuf = SBUF;
if (!memcmp(RxBuf, "START", 5)) {
    // *started*
}

qinyuming452 发表于 2020-4-5 19:55:21

Himem 发表于 2020-4-5 19:45
不用环形缓冲区的话, 基本思路就是这样了:
char RxBuf;
……


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

lcw_swust 发表于 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

qinyuming452 发表于 2020-4-7 09:39:10

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

已收藏,学习,谢谢。

饭桶 发表于 2020-4-7 09:44:05

首先得有起始码和结束码,另外别在串口中断里直接比较字符。

小李非刀 发表于 2020-4-7 18:10:19

具体距离:
定义一个字符串:u8 code CMD1[]="Return Message";
接收计数器:rx_cnt;
每收到一个字节,进串口中断,判断字符是否正确,正确则rx_cnt+1,并判断是否字符接收完毕,不正确将rx_cnt=0;
这样处理,不会影响串口原有的程序。

qinyuming452 发表于 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

qinyuming452 发表于 2020-4-8 21:04:36

小李非刀 发表于 2020-4-7 18:10
具体距离:
定义一个字符串:u8 code CMD1[]="Return Message";
接收计数器:rx_cnt;


感谢指导!我再多去学习学习

jinlei6394 发表于 2020-4-9 02:27:43

本帖最后由 jinlei6394 于 2020-4-9 02:30 编辑

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

qinyuming452 发表于 2020-4-9 20:34:47

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

感谢指导!学习学习

dzdzwkx2013 发表于 2020-4-14 15:41:52

不要将延时放在中断内,看看STC的例程。
页: [1]
查看完整版本: 求指点,STC15W204S串口接收字符串比较的问题