您尚未登录。

楼主 #1 2019-08-27 08:38:17

gunge204
会员
注册时间: 2019-08-24
已发帖子: 26
积分: 26

用licheepi zero打开串口1ttyS1失败

按照学习的资料,我首先修改了以下地方,在dts里使能UART
sun8i-v3s.dtsi:
uart0_pins_a: uart0@0 { pins = "PB8", "PB9";function = "uart0";bias-pull-up; };
uart1_pins_a: uart1@0 { pins = "PE21", "PE22";function = "uart1";bias-pull-up; };
uart2_pins_a: uart2@0 { pins = "PB0", "PB1";function = "uart2";bias-pull-up; };

sun8i-v3s-licheepi-zero.dts:
&uart0 { pinctrl-0 = <&uart0_pins_a>;pinctrl-names = "default";status = "okay"; };
&uart1 { pinctrl-0 = <&uart1_pins_a>;pinctrl-names = "default";status = "okay"; };
&uart2 { pinctrl-0 = <&uart2_pins_a>;pinctrl-names = "default";status = "okay"; };

最后在licheepi zero的dev文件夹下确实发现了有ttyS0、ttyS1、ttyS2等文件,但是按照例子打开ttyS1,还是提示打开失败
fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NONBLOCK);

搞不懂了,另外,sun8i-v3s.dtsi和sun8i-v3s-licheepi-zero.dts这俩文件我改的是linux内核里的,不是u-boot里的,难道u-boot里的这俩文件也要改?

离线

#2 2019-08-27 08:55:35

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,245
积分: 9197

Re: 用licheepi zero打开串口1ttyS1失败

1. 不需要改 u-boot 里面的设备树配置和驱动

2. 你看下 kernel 的 log, 有没有提示这三个 串口都启动成功了,有可能别的复用,导致 IO 冲突,有些ttyS没有成功。





离线

楼主 #3 2019-08-27 21:24:11

gunge204
会员
注册时间: 2019-08-24
已发帖子: 26
积分: 26

Re: 用licheepi zero打开串口1ttyS1失败

我看了一下,与串口有关的log就这点:
[    0.067694] io scheduler noop registered
[    0.067701] io scheduler deadline registered
[    0.067930] io scheduler cfq registered (default)
[    0.072067] sun8i-v3s-pinctrl 1c20800.pinctrl: initialized sunXi PIO driver
[    0.141961] Serial: 8250/16550 driver, 8 ports, IRQ sharing disabled
[    0.145388] console [ttyS0] disabled
[    0.165615] 1c28000.serial: ttyS0 at MMIO 0x1c28000 (irq = 34, base_baud = 1500000) is a U6_16550A
[    0.765465] console [ttyS0] enabled
[    0.790420] 1c28400.serial: ttyS1 at MMIO 0x1c28400 (irq = 35, base_baud = 1500000) is a U6_16550A

这是不对?而且我ttyS1和ttyS2都试过,都打不开。
我这是LicheePi Zero,带底板的那种,修改了linux/arch/arm/boot/dts下边的文件,加上了串口1和串口2的内容
我的设备树是用的sun8i-v3s-licheepi-zero-dock.dtb
根文件系统用的是资料上推荐的rootfs_brmin,
在开发板上的dev/下有如下文件:
FluxBB bbcode 测试

而且我在编译内核的时候,发现有这么几条提醒,似乎有问题:
  DTC     arch/arm/dts/sun8i-v3s-licheepi-zero.dtb
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/uart0@0 has a unit name, but no reg property
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/mmc0@0 has a unit name, but no reg property
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/ahci_pwr_pin@0 has a unit name, but no reg property
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/usb0_vbus_pin@0 has a unit name, but no reg property
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/usb1_vbus_pin@0 has a unit name, but no reg property
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (unit_address_vs_reg): Node /soc/pinctrl@01c20800/usb2_vbus_pin@0 has a unit name, but no reg property
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/mmc@01c0f000 simple-bus unit address format error, expected "1c0f000"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/mmc@01c10000 simple-bus unit address format error, expected "1c10000"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/mmc@01c11000 simple-bus unit address format error, expected "1c11000"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/usb@01c19000 simple-bus unit address format error, expected "1c19000"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/phy@01c19400 simple-bus unit address format error, expected "1c19400"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/clock@01c20000 simple-bus unit address format error, expected "1c20000"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/rtc@01c20400 simple-bus unit address format error, expected "1c20400"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/pinctrl@01c20800 simple-bus unit address format error, expected "1c20800"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/timer@01c20c00 simple-bus unit address format error, expected "1c20c00"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/watchdog@01c20ca0 simple-bus unit address format error, expected "1c20ca0"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/serial@01c28000 simple-bus unit address format error, expected "1c28000"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/serial@01c28400 simple-bus unit address format error, expected "1c28400"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/serial@01c28800 simple-bus unit address format error, expected "1c28800"
arch/arm/dts/sun8i-v3s-licheepi-zero.dtb: Warning (simple_bus_reg): Node /soc/interrupt-controller@01c81000 simple-bus unit address format error, expected "1c81000"
  SHIPPED dts/dt.dtb


晕哥 说:

1. 不需要改 u-boot 里面的设备树配置和驱动

2. 你看下 kernel 的 log, 有没有提示这三个 串口都启动成功了,有可能别的复用,导致 IO 冲突,有些ttyS没有成功。

最近编辑记录 gunge204 (2019-08-27 21:30:54)

离线

#4 2019-08-27 21:27:17

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,245
积分: 9197

Re: 用licheepi zero打开串口1ttyS1失败

echo "test" > /dev/ttyS1

试一试这个命令





离线

楼主 #5 2019-08-27 21:35:31

gunge204
会员
注册时间: 2019-08-24
已发帖子: 26
积分: 26

Re: 用licheepi zero打开串口1ttyS1失败

分别试了,结果是这个:
#
# echo "test" > /dev/ttyS1
#
# echo "test" > /dev/ttyS2                                                                                                                                   
-sh: write error: Input/output error
#
#
好像是1还行,2不行?

晕哥 说:

echo "test" > /dev/ttyS1

试一试这个命令

最近编辑记录 gunge204 (2019-08-27 21:36:32)

离线

#6 2019-08-27 22:09:57

晕哥
管理员
所在地: 微信 whycan_cn
注册时间: 2017-09-06
已发帖子: 9,245
积分: 9197

Re: 用licheepi zero打开串口1ttyS1失败

ttyS2 在 log 没有出现吧, 说明设备树配置有问题.

ttyS1 可以, 说明前面你的代码有问题.





离线

楼主 #7 2019-08-27 22:15:53

gunge204
会员
注册时间: 2019-08-24
已发帖子: 26
积分: 26

Re: 用licheepi zero打开串口1ttyS1失败

对,ttyS2根本没在log里出现,除了修改那两个文件之外,设备树还要配置哪里?
还是那俩文件我改的地方不对?一楼的那几句话分别应该放在文件的什么地方?

另外,我的代码其实很简单,贴出来看看(以ttyS2为例,ttyS1是一样的):

#include <termios.h> //linux下的串口驱动头文件
#include <stdio.h>
//#include <sys/stat.h>
#include <unistd.h>
//#include <sys/signal.h>
//#include <signal.h>
#include <sys/types.h>
#include <fcntl.h> //define O_WRONLY and O_RDONLY

#include <string.h>
#include <stdlib.h>

int main()
{
   int fd, i;
   struct termios ttyCfg;
   char buf[1024];
   char strBuf[] = "Hello! This message from Licheepi ttyS2\n";

   //尝试打开tty1
   fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY | O_NDELAY);
   if (fd = -1)
   {
      printf("Err INfo: open ttyS2 error!\n");
      return EXIT_FAILURE;
   }
   //初始化串口--------------------------
   tcgetattr(fd, &ttyCfg);             //获取终端的新参数,获得串口指向termios结构的指针
   ttyCfg.c_cflag |= (CLOCAL | CREAD); //忽略调制解调器,使用接收器
   cfsetispeed(&ttyCfg, B115200);      //设置输入波特率
   cfsetospeed(&ttyCfg, B115200);      //设置输出波特率
   ttyCfg.c_cflag &= ~CSIZE;           //屏蔽其他标志位
   ttyCfg.c_cflag |= CS8;              //8位数据位
   ttyCfg.c_cflag &= ~CSTOPB;          //1位停止位
   ttyCfg.c_cflag &= ~PARENB;          //无校验
   ttyCfg.c_cflag &= ~CRTSCTS;         //不使用流控
   ttyCfg.c_cc[VTIME] = 0;             //非规范模式读取时的超时时间
   ttyCfg.c_cc[VMIN] = 0;              //非规范模式读取时的最小字符数
   tcflush(fd, TCIFLUSH);              //清空串口数据和请求
   tcsetattr(fd, TCSANOW, &ttyCfg);    //参数保存到tty1串口,TCSANOW:不等数据传输完毕就立即改变属性。
   while (1)
   {
      //发送点数据测试--------------------
      printf("Licheepi send somthing use ttyS2\n");
      write(fd, strBuf, strlen(strBuf));
      usleep(2000000); //us
      //接收到的数据打印出来--------------
      i = read(fd, buf, 1000);
      if (i > 0)
      {
         printf("Licheepi ttyS2 receive from PC,len=%d, message:%s\n", i, buf);
      }
   }
   close(fd);
   return (0);
}


晕哥 说:

ttyS2 在 log 没有出现吧, 说明设备树配置有问题.

ttyS1 可以, 说明前面你的代码有问题.

最近编辑记录 gunge204 (2019-08-27 22:19:43)

离线

楼主 #8 2019-08-28 00:34:07

gunge204
会员
注册时间: 2019-08-24
已发帖子: 26
积分: 26

Re: 用licheepi zero打开串口1ttyS1失败

结贴:
1、设备树确实有问题,因为我用的linux是4.10.y分支,改用4.13.y分之后,重新编译,设备树正常
2、ttyS1文件打不开的原因,不是因为真的打不开,而是一句低级错误的代码造成的(哈哈哈):
fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
   if (fd = -1)
   {
      printf("Err INfo: open ttyS1 error!\n");
      return EXIT_FAILURE;
   }
最后,感谢晕哥,你的判断完全正确!

离线

#9 2019-10-11 17:51:36

yuliang_8
会员
所在地: 番禺 广州 中国
注册时间: 2019-08-28
已发帖子: 20
积分: 20

Re: 用licheepi zero打开串口1ttyS1失败

我也最近想接一个串口低速设备,也有这个问题。
我用的是3.4的BSP内核。 sys_config.fex也是对的 。
/dev/ttyS1和 ttyS2都有。

但是像上面的 @gunge204 老兄这样。 115200字节,收发跟电脑,lichee接收打印出来的是乱码,发送在PC端收到的都是乱码!

但是 默认9600波特率的,发送到电脑的是正常的,接收却也是乱码。

@晕哥,大家有碰到这种情况码?是时钟分频不对?还是啥原因?
。。。。。

离线

#10 2020-04-13 21:51:25

MK-2020
会员
注册时间: 2020-01-02
已发帖子: 51
积分: 46

Re: 用licheepi zero打开串口1ttyS1失败

大神,看了你的代码我也跟着写if (fd = -1),结果打开串口失败。呵呵

离线

#11 2020-04-13 22:02:50

吕氏春秋
会员
注册时间: 2020-03-18
已发帖子: 36
积分: 36

Re: 用licheepi zero打开串口1ttyS1失败

MK-2020 说:

大神,看了你的代码我也跟着写if (fd = -1),结果打开串口失败。呵呵

笑哭.gif

离线

#12 2020-04-14 16:10:38

zhang235hai
会员
注册时间: 2020-04-06
已发帖子: 212
积分: 165

Re: 用licheepi zero打开串口1ttyS1失败

晕哥 说:

ttyS2 在 log 没有出现吧, 说明设备树配置有问题.

ttyS1 可以, 说明前面你的代码有问题.


zhang@ubuntu:~/myserial$ /home/zhang/buildroot-2017.08.1/output/build/qt5base-5.9.1/bin/qmake myserial.pro
Project ERROR: Unknown module(s) in QT: serialport

我用QT做了一个简单的串口界面,用qmake编译的时候出现上面这个错误,是什么原因呢?

离线

#13 2020-04-14 16:21:09

有梦的地方
会员
注册时间: 2020-03-17
已发帖子: 284
积分: 284

Re: 用licheepi zero打开串口1ttyS1失败

可能你的 buildroot 没有勾选 qt serial

离线

#14 2020-04-14 17:06:06

xblzy0423
会员
注册时间: 2020-03-12
已发帖子: 48
积分: 48

Re: 用licheepi zero打开串口1ttyS1失败

ttyS1 和ttyS2我的在log里出现也没出现,但现在能用,新手不太懂

离线

#15 2020-04-15 08:54:31

zhang235hai
会员
注册时间: 2020-04-06
已发帖子: 212
积分: 165

Re: 用licheepi zero打开串口1ttyS1失败

有梦的地方 说:

可能你的 buildroot 没有勾选 qt serial


我在buildboot 里面勾选了 qt5serialbus 和 qt5serialprot 两个选项
保存
重新编译
用qmake编译后还是报Project ERROR: Unknown module(s) in QT: serialport错误

离线

#16 2020-04-15 12:00:34

MK-2020
会员
注册时间: 2020-01-02
已发帖子: 51
积分: 46

Re: 用licheepi zero打开串口1ttyS1失败

楼主,write(fd, strBuf, strlen(strBuf));执行这个可以发送成功,PC端也收到正确数据了。但是执行到这里i = read(fd, buf, 1000);好像读不到数据,读到的回值是-1。PC端串口助手发12345,返回12345。路过的大神们帮忙指点一二,谢谢!
个人感觉是驱动问题,因为在执行echo "12345" > /dev/ttyS2,PC端这边能收到12345。执行cat /dev/ttyS2后,PC端串口助手发12345,返回也是12345。自发自收了。cat /dev/ttyS2执行后如果正常是不是可以显示12345的?现在是不会显示,反而是PC串口助手那边自发自收了。实在是新手不懂,知道的大佬们帮解答一下。谢谢!

离线

#17 2020-04-15 23:35:09

MK-2020
会员
注册时间: 2020-01-02
已发帖子: 51
积分: 46

Re: 用licheepi zero打开串口1ttyS1失败

已经解决。忘记要换行或回车linux的串口才算收完数据。呵呵,新手太难了。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn