由于项目中用到了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("\nCould not open the server message queue\n"); _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("\nCould not receive a message\n"); _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 \n"); _task_block(); } */ _msg_free(msg_ptr); //just for the test.mabe it is error. }
|