Page 1 of 2

UART3和UART4无法通信

Posted: 2024-04-04 7:52
by ezreal
但我单独测试UART3/4的RX和TX,都可以正常接发数据。
当时当我将UART3.TX连接UART4.RX,以及UART4.TX连接UART3.RX,如下图:
95b1462257c3db073cf1e3ce7d7de13.jpg
e792764a1377f881968d260fe0269aa.jpg
使用以下代码测试(一开始尝试的是单线程版):

Code: Select all

from periphery import Serial
import threading
import time

def uart3_task():
    uart3 = Serial(
        "/dev/ttyS3",
        baudrate=115200,
        databits=8,
        parity="none",
        stopbits=1,
        xonxoff=False,
        rtscts=False,
    )

    # Send messages from UART3
    print("UART3 starts working!")
    msg = b"START, PLEASE!\n"

    while True:
        # Continuously send messages until response received from UART4
        uart3.write(msg)
        print(f"UART3 sent: {msg}!")

        time.sleep(0.5)  # Sleep for 1 second between messages

        # Check if response received from UART4
        buf = uart3.read(128, 1)  # Set timeout to 1 second
        print(f"UART3 receive: {buf}")
        if buf:
            data_string = buf.decode("utf-8").strip()
            if data_string == "Response from UART4!":
                print("UART3 received response from UART4:", data_string)
                break  # Break out of loop if response received

    uart3.close()

def uart4_task():
    uart4 = Serial(
        "/dev/ttyS4",
        baudrate=115200,
        databits=8,
        parity="none",
        stopbits=1,
        xonxoff=False,
        rtscts=False,
    )
    print("UART4 starts working!")
    while True:
        # Wait for message from UART3
        buf = uart4.read(128, 5)  # Set timeout to 1 second
        print(f"UART4 received: {buf}")
        if buf:
            data_string = buf.decode("utf-8").strip()
            print("UART4 received:", data_string)

            # Send response from UART4
            uart4.write(b"Response from UART4!\n")
            print("UART4 sent: Response from UART4!")

    uart4.close()

# Create and start threads for UART tasks
thread_uart3 = threading.Thread(target=uart3_task)
thread_uart4 = threading.Thread(target=uart4_task)

thread_uart3.start()
thread_uart4.start()

# Wait for threads to finish
thread_uart3.join()
thread_uart4.join()
输出日志如下:

Code: Select all

# python uart.py
UART3 starts working!
UART3 sent: b'START, PLEASE!\n'!
UART4 starts working!
UART3 receive: b''
UART3 sent: b'START, PLEASE!\n'!
UART3 receive: b''
UART3 sent: b'START, PLEASE!\n'!
UART3 receive: b''
UART3 sent: b'START, PLEASE!\n'!
UART4 received: b''
UART3 receive: b''
UART3 sent: b'START, PLEASE!\n'!
UART3 receive: b''
UART3 sent: b'START, PLEASE!\n'!
UART3 receive: b''
UART3 sent: b'START, PLEASE!\n'!
UART4 received: b''
可以看到,UART3/4都是正常的,但是无法接受数据。

不知道这是什么原因?

Re: UART3和UART4无法通信

Posted: 2024-04-07 1:52
by Crocodile
您好,根据您的测试程序的输出结果,程序虽然使用了time.sleep将UART3线程挂起了0.5秒,但是显示根据您的程序设计UART4的线程需要经过初始化等步骤再开始接收在0.5s内无法完成所有操作,所以很快又切回UART3线程,UART4线程没有运行的机会。
这涉及到多线程设计的内容,建议从线程同步的角度来解决问题,比如使用互斥锁(threading.Lock())来完善您的测试程序。

Re: UART3和UART4无法通信

Posted: 2024-04-08 8:10
by ezreal
Crocodile wrote: 2024-04-07 1:52 您好,根据您的测试程序的输出结果,程序虽然使用了time.sleep将UART3线程挂起了0.5秒,但是显示根据您的程序设计UART4的线程需要经过初始化等步骤再开始接收在0.5s内无法完成所有操作,所以很快又切回UART3线程,UART4线程没有运行的机会。
这涉及到多线程设计的内容,建议从线程同步的角度来解决问题,比如使用互斥锁(threading.Lock())来完善您的测试程序。
我通过一种很奇怪的方式解决了这个问题,UART3.RX连接UART4.RX,UART3.TX连接UART4.TX。最终可以正常通讯。不知道是端口标识搞错了,还是必须是这样。

Re: UART3和UART4无法通信

Posted: 2024-04-29 8:29
by zgsxtyzgd
ezreal wrote: 2024-04-08 8:10
Crocodile wrote: 2024-04-07 1:52 您好,根据您的测试程序的输出结果,程序虽然使用了time.sleep将UART3线程挂起了0.5秒,但是显示根据您的程序设计UART4的线程需要经过初始化等步骤再开始接收在0.5s内无法完成所有操作,所以很快又切回UART3线程,UART4线程没有运行的机会。
这涉及到多线程设计的内容,建议从线程同步的角度来解决问题,比如使用互斥锁(threading.Lock())来完善您的测试程序。
我通过一种很奇怪的方式解决了这个问题,UART3.RX连接UART4.RX,UART3.TX连接UART4.TX。最终可以正常通讯。不知道是端口标识搞错了,还是必须是这样。
我UART3/4也不能用,都没编程,之间用的例程 echo 都不行。看起来得试验一下

Re: UART3和UART4无法通信

Posted: 2024-04-29 10:47
by Crocodile
ezreal wrote: 2024-04-08 8:10
Crocodile wrote: 2024-04-07 1:52 您好,根据您的测试程序的输出结果,程序虽然使用了time.sleep将UART3线程挂起了0.5秒,但是显示根据您的程序设计UART4的线程需要经过初始化等步骤再开始接收在0.5s内无法完成所有操作,所以很快又切回UART3线程,UART4线程没有运行的机会。
这涉及到多线程设计的内容,建议从线程同步的角度来解决问题,比如使用互斥锁(threading.Lock())来完善您的测试程序。
我通过一种很奇怪的方式解决了这个问题,UART3.RX连接UART4.RX,UART3.TX连接UART4.TX。最终可以正常通讯。不知道是端口标识搞错了,还是必须是这样。
您好,luckfox-pico mini 的引脚图确实出现了标记错误的情况,在wiki上已经做了更新,商店页面后在后续更正,以wiki上的为准。

Re: UART3和UART4无法通信

Posted: 2024-04-29 10:54
by Crocodile
zgsxtyzgd wrote: 2024-04-29 8:29
ezreal wrote: 2024-04-08 8:10
Crocodile wrote: 2024-04-07 1:52 您好,根据您的测试程序的输出结果,程序虽然使用了time.sleep将UART3线程挂起了0.5秒,但是显示根据您的程序设计UART4的线程需要经过初始化等步骤再开始接收在0.5s内无法完成所有操作,所以很快又切回UART3线程,UART4线程没有运行的机会。
这涉及到多线程设计的内容,建议从线程同步的角度来解决问题,比如使用互斥锁(threading.Lock())来完善您的测试程序。
我通过一种很奇怪的方式解决了这个问题,UART3.RX连接UART4.RX,UART3.TX连接UART4.TX。最终可以正常通讯。不知道是端口标识搞错了,还是必须是这样。
我UART3/4也不能用,都没编程,之间用的例程 echo 都不行。看起来得试验一下
您好,请问您遇到的问题是类似题主用两个串口进行互相通讯还是单个串口功能无法实现。如果是前者,题主的程序线程只是测试使用,在实际运行下UART3线程较早运行然后连续发送(没有调度到串口4线程),串口4需要过段时间调度到后才能开始接收程序,实验现象并不是一接一收。
如果是后者请先确定好是否存在/dev/ttyS3和/dev/ttyS4 设备,如果使用串口转USB请确定波特率是否设置正确。

Re: UART3和UART4无法通信

Posted: 2024-05-01 13:19
by zgsxtyzgd
Crocodile wrote: 2024-04-29 10:54
zgsxtyzgd wrote: 2024-04-29 8:29
ezreal wrote: 2024-04-08 8:10

我通过一种很奇怪的方式解决了这个问题,UART3.RX连接UART4.RX,UART3.TX连接UART4.TX。最终可以正常通讯。不知道是端口标识搞错了,还是必须是这样。
我UART3/4也不能用,都没编程,之间用的例程 echo 都不行。看起来得试验一下
您好,请问您遇到的问题是类似题主用两个串口进行互相通讯还是单个串口功能无法实现。如果是前者,题主的程序线程只是测试使用,在实际运行下UART3线程较早运行然后连续发送(没有调度到串口4线程),串口4需要过段时间调度到后才能开始接收程序,实验现象并不是一接一收。
如果是后者请先确定好是否存在/dev/ttyS3和/dev/ttyS4 设备,如果使用串口转USB请确定波特率是否设置正确。
您好,我仅仅修改了 文件 rv1106g-luckfox-pico-pro-max.dts
把pwm全部注释了,包括 I2C 的部分 。
UART部分如下
&uart3 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart3m1_xfer>;
};
&uart4 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart4m1_xfer>;
};
其中 uart3m1_xfer和 uart4m1_xfer
在文件 rv1106-pinctrl.dtsi 的定义中
uart3m1_xfer: uart3m1-xfer {
rockchip,pins =
/* uart3_rx_m1 */
<1 RK_PD1 5 &pcfg_pull_up>,
/* uart3_tx_m1 */
<1 RK_PD0 5 &pcfg_pull_up>;
};
uart4m1_xfer: uart4m1-xfer {
rockchip,pins =
/* uart4_rx_m1 */
<1 RK_PC4 4 &pcfg_pull_up>,
/* uart4_tx_m1 */
<1 RK_PC5 4 &pcfg_pull_up>;
};
分别是
uart3m1_xfer:针脚是 GPIO1_D0/GPIO1_D1 上拉高电平 (开发板针脚19/20)
uart4m1_xfer:针脚是 GPIO1_C5/GPIO1_C4 上拉高电平
编译后烧入系统,电脑通过ch340连接到相关针脚(20/19)后使用 波特率 9600 用 echo hello > /dev/ttyS3 后 电脑端没有反应。用万用表测量 20/19 针脚电压(相对GND)为0。 如果我理解的没错, <1 RK_PD1 5 &pcfg_pull_up> 应该是表示 GPIO1_D1 上拉,应该能检测到3.3伏的电压
至少我的开发板不能使用 uart
开发板后标识为 LCPI-RV1106_V1.2(303RV1106G1)
最后,用uart2是可以登录入终端的,证明ch340没有问题
希望您能给予解答

Re: UART3和UART4无法通信

Posted: 2024-05-02 12:04
by zgsxtyzgd
Crocodile wrote: 2024-04-29 10:54
zgsxtyzgd wrote: 2024-04-29 8:29
ezreal wrote: 2024-04-08 8:10

我通过一种很奇怪的方式解决了这个问题,UART3.RX连接UART4.RX,UART3.TX连接UART4.TX。最终可以正常通讯。不知道是端口标识搞错了,还是必须是这样。
我UART3/4也不能用,都没编程,之间用的例程 echo 都不行。看起来得试验一下
您好,请问您遇到的问题是类似题主用两个串口进行互相通讯还是单个串口功能无法实现。如果是前者,题主的程序线程只是测试使用,在实际运行下UART3线程较早运行然后连续发送(没有调度到串口4线程),串口4需要过段时间调度到后才能开始接收程序,实验现象并不是一接一收。
如果是后者请先确定好是否存在/dev/ttyS3和/dev/ttyS4 设备,如果使用串口转USB请确定波特率是否设置正确。
找到原因了,我的板子的引脚和你们标准文档不一样,我的板子版本是 “(303RV1106G1)” 很多引脚是悬空的,没接入主控芯片。
同时,我想知道这些不同板子之间的差异

Re: UART3和UART4无法通信

Posted: 2024-05-04 12:54
by Luckfox Taylor
可以自己对比官网的数据手册。
https://wiki.luckfox.com/zh/Luckfox-Pico/Datasheets

Re: UART3和UART4无法通信

Posted: 2024-05-05 4:54
by zgsxtyzgd
Luckfox Taylor wrote: 2024-05-04 12:54 可以自己对比官网的数据手册。
https://wiki.luckfox.com/zh/Luckfox-Pico/Datasheets
望告知具体型号