今天又踩了很多坑。总结一下关于linux下如何操作串口,以及遇到的一系列问题如何解决的方法。
老话,在Linux下万物皆文件。
在 Linux 中,所有的设备文件一般都位于“/dev”下,其中串口一、串口二对应的设备名依次为“/dev/ttyS0”、“/dev/ttyS1”。在 Linux 下对设备的操作方法与对文件的操作方法是一样的,因此,对串口的读写就可以使用简单的“read”,“write”函数来完成
终端输入指令: ls -l /dev/ttyS*
上图展示的就是linux中串口的名称,一般ttyS0对应com1,ttyS1对应com2。属于 root dialout的分组
我将串口连接到PC linux上。下面两张图片说明了串口连接成功
查看串口设备 dmesg | grep ttyS*
控制台的 tty0已启用。 可以看到串口连接到ttyUSB0上。
int8_t uart_init(void)
{
int8_t rc = 0;
// fp_uart = open("/dev/ttyATH0", O_RDWR | O_TRUNC | O_NDELAY | O_NOCTTY);
fp_uart = open("/dev/ttyS0", O_RDWR | O_TRUNC | O_NDELAY | O_NOCTTY);
UART_DEF_PRINTF("fp_uart = %d\n",fp_uart);
UART_DEF_PRINTF("debug : %s\n", strerror(errno));
if(fp_uart != -1)
{
UART_DEF_PRINTF("/dev/ttyATH0 Open Success\n");
uart_SetSpeed(fp_uart,115200);
uart_SetParity(fp_uart,8,1,'N');
rc = 0;
}
else
{
UART_DEF_PRINTF("/dev/ttyATH0 Open Faile\n");
rc = -1;
}
return rc;
}
在调用串口初始化的函数时,open()的返回函数一直为-1。没有创建成功,导致串口没法使用。
如果返回的是-1,那么errno就会被设置。
也就是说,打开文件失败,那么错误信息就会被存放在errno中。
那么我将errno的信息进行输出,
1、errno的头文件#include <errno.h>
2、errno需要函数strerror包装
3、strerror的头文件#include <string.h>
使用方法: UART_DEF_PRINTF("debug : %s\n", strerror(errno));
可以看到是打开串口的权限的问题。这时就得考虑,自己并非root用户,需要将ttyS0的权限开放。
可以参考这篇博客,进行解决
https://blog.csdn.net/itas109/article/details/83027431
终端输入: ls -l /dev/ttyUSB0
拥有者是root , 分组是dialout
输入: grep 'dialout' /etc/group
终端:dialout:x:20:
新增用户到用户组下
重启之后生效
这时候在进行串口连接,就会成功。
在继续调试的过程中,一直持续向外打印的时候,过一段时间,就会崩掉
打印显示,接收到了65535个字节,按理说我没有接收到呀,将错误信息进行输出resource temporarily unavailable,资源耗尽了!!!
这时候意识到,
我打开的是ttyS0,在PC 端,这个是命令行终端使用的,我这里实际挂载是在ttyUSB0。进行修改
在自己的开发板上,需要修改成openwrt系统中自带的端口,同时要关闭自带的打印功能,否则也会出现上面的问题。
将串口的tx rx连接在一起,终端进行打印