0

我设置了一个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 中接收到的数据的开头删除多余的字符(?)?

4

1 回答 1

0

您不需要删除它们,只是不要将它们传递给您的处理。您可以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'。目前你覆盖了你所有的内存。

于 2020-01-06T10:59:35.023 回答