求指点,STC15W204S串口接收字符串比较的问题
本帖最后由 qinyuming452 于 2020-4-5 18:23 编辑大佬,纯新手求指导一下,
怎样接收到指定的字符串的后,
进行比较是否接收到正解的字符串呢?
比较到正确的字符串后,再去实行其它指令?
现在只理解到发送一个字符,但发送到一组字符串后不懂得应该怎样去比较了
每收到一个字节就存到环形缓冲区,
然后比较最近N个字符是不是要的字符串 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;
}
}
不用环形缓冲区的话, 基本思路就是这样了:
char RxBuf;
……
memmove(RxBuf, RxBuf+1, 4);
RxBuf = SBUF;
if (!memcmp(RxBuf, "START", 5)) {
// *started*
} Himem 发表于 2020-4-5 19:45
不用环形缓冲区的话, 基本思路就是这样了:
char RxBuf;
……
谢谢,我试试着去理解一下这个,
另外如果使用环形缓冲的话,
又应该如何编写! 1.如果有结束码(如结尾有0x0D 0x0A),
数据可先放入数组,收到结束码后再用strcmp 之类的函数或自己写个比较程序去比较.
我用过这种方法:https://www.amobbs.com/thread-5727495-1-1.html
2.如果没有结束码,字符串位置不确定,
状态机了解一下:
http://m.elecfans.com/article/903889.html
lcw_swust 发表于 2020-4-7 09:26
1.如果有结束码(如结尾有0x0D 0x0A),
数据可先放入数组,收到结束码后再用strcmp 之类的函数或自己写个比较 ...
已收藏,学习,谢谢。
首先得有起始码和结束码,另外别在串口中断里直接比较字符。 具体距离:
定义一个字符串:u8 code CMD1[]="Return Message";
接收计数器:rx_cnt;
每收到一个字节,进串口中断,判断字符是否正确,正确则rx_cnt+1,并判断是否字符接收完毕,不正确将rx_cnt=0;
这样处理,不会影响串口原有的程序。 饭桶 发表于 2020-4-7 09:44
首先得有起始码和结束码,另外别在串口中断里直接比较字符。
假如要比较的是接收一组长度不一的16进制的数据,
3A XX XX XX XX XX 0D 0A
3A是固定起始码,0D 0A是结束码,
这样的话不在串口中断中直接比较的话,
后继应该如何编写?
然后返回发送的话固定的起始码是A3,
结束码还依然是0D 0A 小李非刀 发表于 2020-4-7 18:10
具体距离:
定义一个字符串:u8 code CMD1[]="Return Message";
接收计数器:rx_cnt;
感谢指导!我再多去学习学习 本帖最后由 jinlei6394 于 2020-4-9 02:30 编辑
环形容器如果觉得写着比较麻烦,只需要一个buf就好了,但要记得每次读完要把没读的部分抄到开头。
以TCP的习惯做法一般是把内容封包,长度+hash+内容,这样做可以近乎100%保证内容正确。当然,他不能纠正,只能校验。
代价是发送的信息需要打包,且每个包多几个字节。在这个应用下,长度一个char即可,hash可使用crc8,也是一个字节。
如果需要纠正,则需要实现重发机制,很麻烦。大多数通信都是脉冲性质的,一般丢几个包也问题不大;如果是遇到特别重要的,可以考虑多发几遍。
jinlei6394 发表于 2020-4-9 02:27
环形容器如果觉得写着比较麻烦,只需要一个buf就好了,但要记得每次读完要把没读的部分抄到开头。
以TCP的 ...
感谢指导!学习学习 不要将延时放在中断内,看看STC的例程。
页:
[1]