如何 trim 在代码视觉中未知字符串的第一个字符
how to trim unknown first characters of string in code vision
我设置了一个mega16(16bit AVR单片机)从串口接收数据
连接到蓝牙模块HC-05以获得可接受的数量
由我的 android 应用程序发送,android 应用程序以
的形式发送一个数字
最大长度为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, '[=11=]', 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, '[=10=]', 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, '[=11=]', sizeof(ss));
} else {
ss[a]=data;
a+=1;
}
但是:
也许您应该尝试解决问题,而不是仅仅解决症状(抑制“?”字符)。
可疑字符的确切值是多少?我怀疑,那个'?仅用于表示不可打印的数据。
可能是你的接口配置有误,发送方使用了线路软件流控,可疑字符为XON
/XOFF
字节
一个补充说明:
如果您使用中断服务例程 (ISR) 中的更复杂的功能甚至外围设备,您可能 运行 会遇到麻烦。
我强烈建议只在此处填充缓冲区,并在主循环中执行所有其他操作。由一些易失性标志数据缓冲区触发。
我也不明白为什么你在 ISR 中使用额外的缓冲区 (ss
),因为似乎已经有一个 RX 缓冲区。该实现看起来有一个很好的 RX 接收缓冲区实现,应该有一些 functions/possibilities 来在主循环中获取缓冲区内容,这样您就不需要将自己的代码添加到 ISR。
补充说明:
string array whose maximum length is equal to 10 digits.
我数的不止这些,我希望你的 ss
数组比那个大,你也应该考虑这样一个事实,即传输可能会出错,在下一个之前你会得到更多的字符 '\n'
。目前你覆盖了所有的内存。
我设置了一个mega16(16bit AVR单片机)从串口接收数据
连接到蓝牙模块HC-05以获得可接受的数量
由我的 android 应用程序发送,android 应用程序以
的形式发送一个数字最大长度为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, '[=11=]', 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, '[=10=]', 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, '[=11=]', sizeof(ss));
} else {
ss[a]=data;
a+=1;
}
但是:
也许您应该尝试解决问题,而不是仅仅解决症状(抑制“?”字符)。
可疑字符的确切值是多少?我怀疑,那个'?仅用于表示不可打印的数据。
可能是你的接口配置有误,发送方使用了线路软件流控,可疑字符为XON
/XOFF
字节
一个补充说明:
如果您使用中断服务例程 (ISR) 中的更复杂的功能甚至外围设备,您可能 运行 会遇到麻烦。
我强烈建议只在此处填充缓冲区,并在主循环中执行所有其他操作。由一些易失性标志数据缓冲区触发。
我也不明白为什么你在 ISR 中使用额外的缓冲区 (ss
),因为似乎已经有一个 RX 缓冲区。该实现看起来有一个很好的 RX 接收缓冲区实现,应该有一些 functions/possibilities 来在主循环中获取缓冲区内容,这样您就不需要将自己的代码添加到 ISR。
补充说明:
string array whose maximum length is equal to 10 digits.
我数的不止这些,我希望你的 ss
数组比那个大,你也应该考虑这样一个事实,即传输可能会出错,在下一个之前你会得到更多的字符 '\n'
。目前你覆盖了所有的内存。