如何 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'。目前你覆盖了所有的内存。