bluetooth - 如何在代码视觉中修剪字符串的未知第一个字符
问题描述
我设置了一个mega16(16位AVR微控制器)从串口接收数据
它连接到蓝牙模块 HC-05 以获得可接受的数量
由我的 android 应用程序发送,一个 android 应用程序以 a 的形式发送一个数字
最大长度等于 10 位的字符串数组。问题来了
在接收数据时,存在一个或两个未知字符(?)
接收到的字符串的开头。我必须从
字符串的开头在存在的情况下。这个问题只针对HC-05。我的意思是我在发送号码时没有问题
另一个微控制器而不是 android 应用程序。
这是我通过手机发送的:
“430102030405060\r”
以及微控制器串口接收到的内容:
“??430102030405060\r”或“?430102030405060\r”
这是 USART 接收器中断代码:
//-------------------------------------------------------------------------
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if (data==0x0D)
{
puts(ss);printf("\r")
a=0;
memset(ss, '\0', sizeof(ss));
}
else
{
ss[a]=data;
a+=1;
}
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index++]=data;
if RX_BUFFER_SIZE == 256
// special case for receiver buffer size=256
if (++rx_counter == 0) rx_buffer_overflow=1;
else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
}
endif
}
}
//-------------------------------------------------------------------------
如何从 codevision 中接收到的数据的开头删除多余的字符(?)?
解决方案
您不需要删除它们,只是不要将它们传递给您的处理。您可以data
在将字符放入行缓冲区 ( ss
) 之前测试该字符,也可以在收到完整行之后查找第一个相关字符,然后仅将从此位置开始的字符串传递给您的处理函数。
变量 1:
BOOL isGarbage(char c){
return c<'0' || c > '9';
}
if (data==0x0D)
{
puts(ss);printf("\r")
a=0;
memset(ss, '\0', sizeof(ss));
} else {
if(!isGarbage(data))
{
ss[a]=data;
a+=1;
}
}
变量2:
if (data==0x0D)
{
const char* actualString = ss;
while(isGarbage(*actualString )){
actualString ++;
}
puts(actualString );printf("\r")
a=0;
memset(ss, '\0', sizeof(ss));
} else {
ss[a]=data;
a+=1;
}
但是:
也许您应该尝试解决问题,而不是仅修复症状(抑制“?”字符)。
可疑字符的确切值是多少?我怀疑,那个'?仅用于表示不可打印的数据。
可能是你的接口配置错误,发送端使用软件流控上线,可疑字符为XON
/XOFF
字节
附加说明:
如果您使用更复杂的功能甚至是中断服务程序 (ISR) 中的外围设备,您可能会遇到麻烦。
我强烈建议只在那里填充缓冲区并在主循环中执行所有其他操作。由一些易失性标志数据缓冲区触发。
此外,我不明白您为什么ss
在 ISR 中使用额外的缓冲区 (),因为似乎已经有一个 RX-Buffer。该实现看起来有一个很好的 RX-receive 缓冲区实现,它应该具有一些功能/可能性来获取主循环中的缓冲区内容,因此您不需要将自己的代码添加到 ISR。
其他附加说明:
最大长度等于 10 位的字符串数组。
我算的不止这些,我希望你的ss
数组比这更大,你还应该考虑这样一个事实,即传输可能会出错,并且在下一个之前你会得到更多的字符'\n'
。目前你覆盖了你所有的内存。
推荐阅读
- git - 如何维护原始文件?
- javascript - 如何根据用户输入(HTML)永久更改网站内容?
- javascript - JS - 根据结束日期返回 PIN 码剩余的活动天数
- automation - 如何比较sikuli中的两个屏幕截图并验证它们是否相同?
- javascript - 在 contenteditable div 中按回车键时如何添加新 div
- xpath - XPATH (eXistdb) 如何替换 HTTP 请求内容中的文字
- angular - 使用 Angular Universal 将 Angular 8 应用程序转换为静态应用程序
- html - 如何将文本放在按钮的中心
- pkcs#7 - 如何批量解压 p7s/p7m 文件
- c# - 如何在不使用 CreateMissingTypeMaps 的情况下升级到 Automapper 9.0 进行查询(因为它已被弃用)?