TA的每日心情 | 开心 2024-3-12 15:52 |
---|
签到天数: 1011 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 idiy 于 2019-5-14 18:27 编辑
串口接收数据及切换界面显示
确定UART连接及在开发板上的名称
i.MX6ULL 和 i.MX6UL 系列处理器最高可达 8 路异步串口。由于芯片的管脚复用关系,
MYB-Y6ULX-HMI 底板扩展出了 1 路 TTL 电平调试串口,1 路 RS232 通讯串口和一路
RS485 通讯串口。先来看看开发板上的硬件连接,如下图:
由图可知,RS232连接的是UART2。
查看系统里的串口名称:
查看串口驱动:
- cd /proc/tty/driver
- ls
- cat IMX-uart
- cat fsl-lpuart
- cat usbserial
复制代码
查看串口设备:
由以上判断,UART2在开发板上的名称为 /dev/ttymxc1。
我们来测试一下,对/dev/ttymxc1 进行设置(115200 8 N 1)
- stty -F /dev/ttyS0 speed 115200 cs8 -parenb -cstopb -echo
复制代码
用RS232连接线连接开发板和PC,打开串口调试助手,串口设置为 115200 8 N 1,然后打开串口:
在开发板上输入:
- echo "12345" > /dev/ttymxc1
复制代码
串口调试助手显示如下:
正确接收到了开发板上发送过来的字符串,说明连线和UART2名称都是正确的。
其实,以上只是为了加深印象而做的测试。有更好的办法来确定UART的名称。就是利用开发板上预装的串口应用来进行回环测试。
在充电桩应用中添加串口代码
打开串口:
- void SystemContentWidget::openSerial()
- {
- if(!openFlag)
- {
- QString serialPortStr = "/dev/ttymxc1";
- QString rateStr = "115200";
- QString checkBitStr = "NONE";
- QString dataBitStr = "8";
- QString stopBbitStr = "1";
- qDebug() << "serialPortStr: " << serialPortStr;
- qDebug() << "port: " << serialPortStr;
- qDebug() << "rate: " << rateStr;
- qDebug() << "check: " << checkBitStr;
- qDebug() << "data: " << dataBitStr;
- qDebug() << "stop: " << stopBbitStr;
- QString tty_configure;
- int fd;
- fd = m_mxde->callOpenSerialPort(serialPortStr,tty_configure);
- qDebug() << "open ret: " << fd;
- if(0 == fd)
- {
- QStringList list = tty_configure.split(" ");
- m_serial_fd = list.at(1).toInt();
- qDebug() << "m_serial_fd: " << m_serial_fd;
- qDebug() << "tty_configure: " << tty_configure;
- setCurrentConfigure(list);
- openFlag = true;
- }
- else
- {
- QString serial_param;
- int serial_mode = TTY_RS232_MODE;
- int tty_flow = 0;
- m_serial_fd = fd;
- checkBitStr = "NONE";
- QByteArray check = checkBitStr.toLatin1();
- serial_param.sprintf("%d %d %d %d %d %s %d",m_serial_fd,rateStr.toInt(),dataBitStr.toInt(), serial_mode, tty_flow,check.data(),stopBbitStr.toInt());
- m_mxde->callSetSerialPort(serial_param);
- openFlag = true;
- }
- }
- else // 关闭串口
- {
- m_mxde->callCloseSerialPort(m_serial_fd);
- m_serial_fd = 0;
- openFlag = false;
- qDebug() << "closed ...";
- }
- }
复制代码
接收数据及处理:
- void SystemContentWidget::onSerialRecvData(int uart_fd, const QString &data, int size)
- {
- if(m_serial_fd == uart_fd )
- {
- QByteArray ba = data.toUtf8();
- char c = ba.data()[ba.size()-1];
- if (isdigit(c))
- {
- if ((c > '0') && (c <= '0' + layoutTotal))
- {
- layoutIdx = c - '1';
- layoutAddWidgetByList(mWidgetList[layoutIdx]);
- }
- }
- }
- }
复制代码
串口助手设置
实际显示效果,由串口助手一秒钟发一条切换界面指令
嗯,完成了最基本的要求了。等我把源码整理一下,上传到github。
源码在这
|
|