一、bug就快要诞生了
由于是在公司项目中,因为某些原因延伸出来了三颗定位芯片,芯片A (bps :9600 )、芯片B((bps :9600)、芯片C((bps :115200),需要让CPU去主动识别这几个芯片来自动适应让其正常工作。SOC和定位芯片的物理连线是串口(UART),就四颗线:RX、TX、Vcc、GND

二、把想法展示出来
由于定位芯片上电会默认运行内部的固件,他们会默认吐出来一下定位信息之类的,但是在soc判断芯片型号的时候,这些无疑是脏信息,因此需要将其关掉,然后再通过指令获取芯片固件之类的啦就可以判断出来型号了
1、先关闭芯片*(A\B\C)所有语句输出
2、发送芯片*(A\B\C)版本信息获取指令
3、是否复合当前芯片*(A\B\C)的名称
按照上述的思路,来个三个循环应该也能解决,不过考虑到SOC的default bps=9600,所以考虑先从9600先切换着走,本质上而言,切换波特率无非就是改变soc的寄存器,时间会很快的,但是为了减少切换次数,我们就还是这样A---->B-->C依次判断,提前满足,提前退出。上面只是框架,实际还需要缝缝补补
三、落到实处
一想到这么简单,立马就开始写完代码,然后开始测试验证:
3.1 芯片们都是 答非所问?
验证的时候发现,我在发送完第一步 “关闭芯片*(A\B\C)所有语句输出”之后进行版本查询,通过read串口读取出来的信息一点也没有,后续通过perror定位发现是这样的错误,不合法的参数
3.2 排查串口的相关属性
在linux平台下,串口的相关属性都是通过struct termios 结构体来配置的,通过对其中内容进行检查,以及参考相应的文档【linux下串口通信打开正常,发送正常,但是接收不到数据的解决办法_linux串口通信 接收不到数据 reboot 首次接收不到, 设置一下就可以接收-优快云博客】,发现原来是串口输入没有设置为原始模式:

3.3 主角登场
更新配置之后,发现数据能获取了,但是判断不了芯片的型号啊,这是什么原因?

还是的回到现在这里的现象时芯片是有回复型号的,会不会是他回复的时间不对??比如已经错误了我这里的read时机,所以导致我的SOC没收到。后面我有突然想到,这种串口应该都有类似缓冲区的机制,他应该是需要等到缓冲区达到多大的阈值才发送,对于实时性要求不高的可能没什么感觉,但是在串口收发过程中,数据应该立马就被发送。因此我需要在
1、先关闭芯片*(A\B\C)所有语句输出
2、发送芯片*(A\B\C)版本信息获取指令
这两部中都让指令立马发送,不能停留在缓冲区中,完美解决,更改后如下(仅作为参考)
set_speed(fd, 9600);//封装的接口
set_Parity(fd,8,1,'n');////封装的接口
sprintf(xmitHex,"$PCAS03,0,0,0,0,0,0,0,0,0,0,,,0,0,,,,0*32\r\n");
u4ret = write(fd, xmitHex, strlen(xmitHex));
usleep(100*1000);
tcdrain(fd);
tcflush(fd,TCIOFLUSH);
sprintf(xmitHex,"$PCAS06,1*1A\r\n"); //GGA打开
u4ret = write(fd, xmitHex, strlen(xmitHex));
usleep(100*1000);
tcdrain(fd);
u4ret = read(fd, xmitHex, sizeof(xmitHex)-1);
四、终章
解决了就可以洗洗睡了。问题其实很简单,只是串口编程烧了,平时只是调用封装好的接口,看样子,有时候轮子还得自己多花点时间去纯手打磨
问题&spm=1001.2101.3001.5002&articleId=135109889&d=1&t=3&u=345982f99285493e81bdd2b8307eb3eb)
530

被折叠的 条评论
为什么被折叠?



