1

我正在使用嵌入式 C 并尝试为 GPRS 终端制作应用程序。我的主要问题是使用 AT 命令。我使用串行线发送 AT 命令,但如果它是一些面向网络的命令,它的响应可能需要时间,因此我有很多等待,而处理器不做任何事情。想法是让这个等待以相同的方式并行完成,就像在不同的线程中一样。有谁知道如何做到这一点,因为我的系统不支持线程?我想使用一些计时器,因为我们有每 5 毫秒调用一次的中断,但我不知道我必须等待多少秒才能等待响应,如果我比较中断中的字符串以检查是否收到所有消息它可以效率很低,对吧?

4

3 回答 3

2

您可以使用中断,将串行接口配置为在数据可用时中断,或者使用 RTOS 之类的东西,例如FreeRTOS来运行两个线程,一个用于主代码,另一个用于阻塞和等待串行数据。

更新:根据您的评论,您说您不知道数据的大小,这很好,在中断处理程序中检查终止数据的字节,这是一个简单而通用的示例,您应该检查您的示例单片机:

void on_serial_char()
{     
  //disable interrupts
  disable_interrupts();

  //read byte
  byte = serial.read();

  //check if it's the terminating byte
  if (byte == END) {
      //set the flag here
      MESSAGE_COMPLETE = 1;
  }

  //add byte to buffer
  buf[length++] = byte;

  //enable interrupts
  enable_interrupts();      
}

并在主循环中检查该标志:

...
if (MESSAGE_COMPLETE) {
    //process data
    ...

    //you may want to clear the flag here
    MESSAGE_COMPLETE = 0;

    //send next command
    ...
}    
于 2012-11-07T09:08:02.583 回答
2

您可以简单地在每个 mainLoopCycle 中调用一个 packetHandler。
此处理程序检查串行端口是否有新字符可用。

packetHandler 将逐位构建响应消息,如果消息是完整的(找到 CR LF),则它调用 messageReceive 函数,否则它只是返回到 mainLoop。

int main()
{
  init();
  for (;;)
  {
     packetHandler();
  }
}

char msgBuffer[80];
int pos=0;
void packetHandler()
{
  char ch;
  while ( isCharAvailable() )
  {
    ch=getChar();
    msgBuffer[pos++] = ch;
    if ( ch == '\n' ) 
    {
       messageReceived(msgBuffer);
       pos=0;
    }
  }
}
于 2012-11-07T09:23:58.747 回答
0

听起来你很接近硬件驱动程序。如果是这样,最好的方法是使用 DMA,如果 MCU 支持,则使用 DMA 硬件的标志来确定何时开始解析接收到的数据。

第二个最佳选择是使用 rx 中断,将每个接收到的字节存储在一个简单的 FIFO 中,例如循环缓冲区,然后在收到它们后设置一些标志。可能需要一个用于传入数据的缓冲区和一个用于接收最新的有效数据的缓冲区。

于 2012-11-07T09:40:35.757 回答