Bluetooth 如何在代码视觉中修剪未知字符串的第一个字符

Bluetooth 如何在代码视觉中修剪未知字符串的第一个字符,bluetooth,serial-port,avr,hc-05,Bluetooth,Serial Port,Avr,Hc 05,我设置了一个mega16(16位AVR微控制器)从串行端口接收数据 连接到蓝牙模块HC-05以获得可接受的数字 由我的android应用程序发送,android应用程序以 最大长度等于10位的字符串数组。问题来了 在接收数据时,使一个或两个未知字符(?)存在于 接收字符串的开头。我必须从中删除这些未知字符 存在时字符串的开头。 此问题仅适用于HC-05。我的意思是我在发送电话号码时没有问题 另一个微控制器代替android应用程序 以下是我通过手机发送的信息: “430102030405060\

我设置了一个mega16(16位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, '\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中从接收到的数据的开头删除额外的字符(?)。

您不需要删除它们,只需不将它们传递给您的处理程序即可。 您可以在将
数据
字符放入行缓冲区(
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;
 }
} 
然而:
也许您应该尝试解决这个问题,而不是仅仅修复症状(抑制“?”字符)

问题字符的确切值是多少?我怀疑“?”只用于表示不可打印的数据

可能您的界面配置错误,发送方在线路上使用软件流控制,可疑字符为
XON
/
XOFF
字节

另请注意:
如果从中断服务例程(ISR)中使用更复杂的功能甚至外围设备,您可能会遇到麻烦

我强烈建议只在那里填充缓冲区,并在主循环中执行所有其他操作。由一些易失性标志数据缓冲区触发

我也不明白为什么在ISR中使用额外的缓冲区(
ss
),因为似乎已经有了RX缓冲区。该实现看起来像是有一个好的RX接收缓冲区实现,它应该具有一些功能/可能性来获取主循环中的缓冲区内容,这样您就不需要将自己的代码添加到ISR中

补充说明:

最大长度等于10位的字符串数组


<> P> >我计算了更多,我希望你的<代码> SS 数组大于它,并且你也应该考虑到传输中可能出错的事实,在下一个代码> '\n '/COD>之前你会得到更多的字符。目前您覆盖了所有ram。

我使用了您所说的方法。实际上,我只想记录数字,然后在usart接收器例程中忽略其他字符。谢谢。

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;
}