一.环境:linux开发板+串口调试助手,条件好的可以用示波器,逻辑分析仪加深印象。以下内容是你有一定的linux驱动知识,至少懂一丢丢吧。
二.调试步骤:
1.先设置设备树dts,打开你的板子上面的debug串口,每个人可能具体不一样,我的是uart2。
&uart2 { status = "okay"; };
ps:注意这个是得你有其他的默认配置下,才只有okey设置,要不然你得声明其他具体的pinctrl子类的细节属性,可上网参考uart驱动开发如何设置设备树,但是一般DTS里面是有的。
2.重新编译内核,烧入板子。
3.写好uart测试程序(可以直接复制我的):
注意测试速率函数在这cfsetospeed(&uart_opts, B9600);
交叉编译得到可执行文件,传输到linux板子上运行。(这步骤如果出问题,就百度一下吧,这个比较通用的知识点。)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main() {
int uart_fd = open("/dev/ttyS2", O_RDWR);
if (uart_fd == -1) {
perror("Error opening UART");
return 1;
}
struct termios uart_opts;
tcgetattr(uart_fd, &uart_opts);
cfsetospeed(&uart_opts, B9600); //这个是波特率,测试波特率就修改这里就可以了,可以设置为你要测试的波特率哦
uart_opts.c_cflag |= CS8;
tcsetattr(uart_fd, TCSANOW, &uart_opts);
char uart[100]={
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff,
0x00,0x01,0x02,0x03,0x04, 0x05,0x06,0x07,0x08,0xff
//00000000 00000001 00000010 00000011 .......
};
while (1) {
write(uart_fd, uart, 100);
sleep(1); // Wait for 1 second
}
// close(uart_fd);
return 0;
}
3.然后打开串口助手连上开发板,注意开发板的uart2的TX连接你的串口RX,GND相连就可以了。打开对应的波特率,看看接受的数据包是否正常,玩过单片机的应该都有串口助手的,我这里就不多说了。这里建议有条件的还是要用示波器、逻辑分析仪等等的抓一下显示一下,以更好理解每个bit的情况。
4.这个是我用逻辑分析仪抓的,我的之前的代码和我上面放的不一样,但是就是改了和数据包而已,没什么两样,这里可以很清楚看到每个bit。一个数据0x01,发出的就是0000 0001,加上起始位0,停止位1,得到就是0 0000 0001 1.可以自己分析看看。
我这里是拿整个数据包除于时间,得到大约9625波特率,也就是一秒9600个位。并在软件上也识别到了波特率为9615(有点误差)。
好了,步骤大概就这些,其实我这里出现了问题,在我波特率大于2M之后,收到的数据包停止位有延迟,4M更明显。目前猜测是波特率太大导致的,因为我是小白,希望有大神看见可以解释下下。
本人第二篇文章,有错误请指出,望谅解。