由于项目中用到了mcu的sci通信,而mqx又恰恰内部集成了相关模块的驱动,那么对我编写相关模块的难度可降低很多了,但是系统级编程的要求无疑提高了很多,有得有失嘛!

  在调试sci的时候,遇到了2个问题,跟大家分享一下:

  1、每次系统在初始化的时候,串口会自动发送2-3个字节的0x00数据,给其他相关模块造成干扰。

  2、每次sci输出之后,系统会自动添加2-3个字节的数据0x00.比如我发送了32个字节,可他收到的是33个字节。

  经过分析发现,原因如下:

  1、系统在初始化时,由于要对bsp进行初始化,串口当然也在其中,那么数据引脚也当然需要由不定状态,转换为确定状态。这出现了错觉,以为发送了0x00的数据。

  该原因是我一个经验丰富的同事,曾遇到的问题,他跟我说以前,他们组因为这个问题搞了2个星期,没想到是系统本身的特性。呵呵,还好这个理由我接受。

  2、这个问题跟我的代码有关了。由于我深受linux代码影响,起初在设计发送任务时,每次接受到数据,打开sci,当发送完毕后在关闭sci,每次发送数据都是这样。起初个人以为,当你的任务不用端口时,要记得关闭,省得对别人造成干扰。但是这出现了第2个问题了。接收端会受到一些无用的数据。

  后来,我改成了sci发送任务,打开sci端口后,不再关闭,死循环阻塞等待消息到来,当有消息时,发送没有阻塞。不再频繁开关sci端口。这才没有了第二个问题。

  但是心中对mqx的sci内部驱动,有些许不爽。我关闭sci端口怎么会出现无用数据呢?姑且认为是mqx的一个小bug吧,你系统初始化时,接收到了无用数据,我认了,可以理解毕竟系统都还没起来呢。可是,在使用过程中,出现了这样的问题,有点不应该了。呵呵

  附上部分源代码:(有什么需要改进的地方,大家不要客气啊)

/* open a message queue */
   sci1_qid = _msgq_open(QNUM_SCI1_SEND_TASK, 0);
   if(sci1_qid == 0)
   {
      // printf(" Could not open the server message queue ");
      _mqx_exit(0);
   }
 
   //open the sci1 channel
   sci1_dev = fopen(BASEBOARD_HEATBOARD_CHANNEL, NULL); 
   if(sci1_dev == NULL)
   {
      /* device could not be opened */
      _task_block();
   }
       
   while (TRUE)
   {
      /* receive the message with block mode */
      msg_ptr = _msgq_receive(sci1_qid, 0);
    
      if (msg_ptr == NULL)
      {
         //printf(" Could not receive a message ");
         _mqx_exit(0);
      }
   
      /* write data to sci1 */
      write(sci1_dev, (&(msg_ptr->DATA)), (msg_ptr->BYTE_NUM));


      /* empty queue - not needed for polled mode */
      fflush(sci1_dev);
 
      /* wait for transfer complete flag */
      /* after experiment,the mqx3.70 doesn't support this ioctl command ,so remove this sentence */
      /*
      result = ioctl(sci1_dev, IO_IOCTL_SERIAL_WAIT_FOR_TC, NULL );
      if(result == IO_ERROR_INVALID_IOCTL_CMD)
      {
        // ioctl not supported, use newer MQX version
        printf("block sci send ");
        _task_block();
      } */
    
      _msg_free(msg_ptr);  //just for the test.mabe it is error.
   }