英伟达Nvidia TX1 TX2 串口通信方法

article/2025/9/22 0:37:17

Nvidia TX1 TX2 串口通信方法

  • 英伟达TX2串口
    • 串口硬件
    • 板子串口描述
    • 硬件连接方式
    • 测试工具及方法
    • c++通信代码

英伟达TX2串口

使用英伟达嵌入式板进行 串口通信

串口硬件

串口位置为下图中红色方框位置,标示UARTQ20和J17。
英伟达嵌入式板 串口位置

板子串口描述

串口共6个引脚,靠近板子边缘处的第一个为GND引脚,接地;
第四个TX引脚;
第五个RX引脚;

通过USB转接连接到主机Host。

硬件连接方式

使用串口转USB转接器,将TX2引脚与主机USB连接。
串口转USB连接线

测试工具及方法

在linux环境下,分别在Host 和 nvidia device 上使用cutecom:

  1. 使用 sudo apt-get install cutecom 即可安装;
  2. 安裝完成后,使用 sudo cutecom 启动程序;

启动界面如下图:
说明:

  1. . Device: 选择串口名称,Host上串口名称为ttyUSB*命名模式,在英伟达TX2上为ttyTHS2,可修改字符串名字。
  2. Settings: 设置波特率等,两者设置相同即可。
  3. 点击 Open启动通信。
  4. Input后输入内容,将会通过软件送到串口,开始通信。
  5. 上部分空白显示串口接收的内容,下方空白显示输入 Input历史。

cutecom 软件界面

c++通信代码

包含三个文件,分别为serialport.h、serialport.cpp、main.cpp文件。
serialport.h:

#ifndef BINOCULAR_CUSTOM_SERIALPORT_H
#define BINOCULAR_CUSTOM_SERIALPORT_H#include <string>
#include <termios.h>#include <vector> struct termios;
class SerialPort {
public:enum BaudRate{ BR0 = 0000000, BR50 = 0000001, BR75 = 0000002,BR110 = 0000003, BR134 = 0000004, BR150 = 0000005, BR200 = 0000006,BR300 = 0000007, BR600 = 0000010, BR1200 = 0000011, BR1800 = 0000012, BR2400 = 0000013,BR4800 = 0000014, BR9600 = 0000015, BR19200 = 0000016, BR38400 = 0000017, BR57600 = 0010001,BR115200 = 0010002, BR230400 = 0010003, BR460800 = 0010004, BR500000 = 0010005, BR576000 = 0010006,BR921600 = 0010007, BR1000000 = 0010010, BR1152000 = 0010011, BR1500000 = 0010012, BR2000000 = 0010013,BR2500000 = 0010014, BR3000000 = 0010015, BR3500000 = 0010016, BR4000000 = 0010017 };enum DataBits { DataBits5, DataBits6, DataBits7, DataBits8, };enum StopBits { StopBits1, StopBits2 };enum Parity { ParityNone, ParityEven, PariteMark, ParityOdd, ParitySpace };struct OpenOptions {bool autoOpen;BaudRate baudRate;DataBits dataBits;StopBits stopBits;Parity parity;bool xon; bool xoff; bool xany; int vmin; int vtime; };static BaudRate BaudRateMake(unsigned long baudrate);static const OpenOptions defaultOptions;explicit SerialPort(const std::string& path, const OpenOptions options = defaultOptions);bool open();bool open(const std::string& path, const OpenOptions& options);bool isOpen() const;int write(const void *data, int length);int read(void *data, int length);void close();static std::vector<std::string > list();
protected:void termiosOptions(termios& tios, const OpenOptions& options);
private:std::string _path;OpenOptions _open_options;int _tty_fd; bool _is_open;
};
bool operator==(const SerialPort::OpenOptions& lhs, const SerialPort::OpenOptions& rhs);
bool operator!=(const SerialPort::OpenOptions& lhs, const SerialPort::OpenOptions& rhs);#endif //BINOCULAR_CUSTOM_SERIALPORT_H

serialport.cpp:

//
// Created by yaqiang on 7/22/19.
//
#include <dirent.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include "serialport.h"const SerialPort::OpenOptions SerialPort::defaultOptions ={ true, //        bool autoOpen;SerialPort::BR9600, //    BaudRate baudRate;SerialPort::DataBits8, //    DataBits dataBits;SerialPort::StopBits1, //    StopBits stopBits;SerialPort::ParityNone,//    Parity parity;false, // input xonfalse, // input xofffalse, // input xany0, // c_cc vmin50, // c_cc vtime};SerialPort::SerialPort(const std::string &path, const OpenOptions options) : _path(path), _open_options(options)
{if(options.autoOpen){printf("opening!\n");_is_open = open(_path, _open_options);}
}bool SerialPort::open()
{return _is_open = open(_path, _open_options), _is_open;
}
bool SerialPort::open(const std::string &path, const OpenOptions &options)
{if(_path != path)_path = path;if(_open_options != options)_open_options = options;_tty_fd = ::open(path.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);if(_tty_fd < 0){return false;}struct termios tios;termiosOptions(tios, options);tcsetattr(_tty_fd, TCSANOW, &tios);tcflush(_tty_fd, TCIOFLUSH); return true;
}
void SerialPort::termiosOptions(termios &tios, const OpenOptions &options)
{tcgetattr(_tty_fd, &tios); tios.c_oflag = 0; tios.c_iflag = 0;tios.c_lflag = 0; cfsetispeed(&tios, options.baudRate);cfsetospeed(&tios, options.baudRate); tios.c_iflag |= (options.xon ? IXON : 0) | (options.xoff ? IXOFF: 0) | (options.xany ? IXANY : 0); // data bitsint databits[] = {CS5, CS6, CS7, CS8}; tios.c_cflag &= ~0x30; tios.c_cflag |= databits[options.dataBits]; // stop bitsif(options.stopBits == StopBits2) { tios.c_cflag |= CSTOPB; } else { tios.c_cflag &= ~CSTOPB; } // parityif(options.parity == ParityNone) { tios.c_cflag &= ~PARENB; } else { tios.c_cflag |= PARENB;if(options.parity == PariteMark) { tios.c_cflag |= PARMRK; } else { tios.c_cflag &= ~PARMRK; }if(options.parity == ParityOdd) { tios.c_cflag |= PARODD; } else { tios.c_cflag &= ~PARODD; }}tios.c_cc[VMIN] = options.vmin; tios.c_cc[VTIME] = options.vtime;
}
bool SerialPort::isOpen() const { return _is_open; }int SerialPort::write(const void *data, int length)
{return ::write(_tty_fd, data, length);
}int SerialPort::read(void *data, int length) { return ::read(_tty_fd, data, length); }void SerialPort::close() { ::close(_tty_fd); _is_open = false; }SerialPort::BaudRate SerialPort::BaudRateMake(unsigned long baudrate)
{switch (baudrate){case 50: return BR50; case 75: return BR75; case 134: return BR134; case 150: return BR150;case 200: return BR200; case 300: return BR300; case 600: return BR600; case 1200: return BR1200;case 1800: return BR1800; case 2400: return BR2400; case 4800: return BR4800; case 9600: return BR9600;case 19200: return BR19200; case 38400: return BR38400; case 57600: return BR57600; case 115200: return BR115200;case 230400: return BR230400; case 460800: return BR460800; case 500000: return BR500000; case 576000: return BR576000;case 921600: return BR921600; case 1000000: return BR1000000; case 1152000: return BR1152000; case 1500000: return BR1500000;case 2000000: return BR2000000; case 2500000: return BR2500000; case 3000000: return BR3000000;case 3500000: return BR3500000; case 4000000: return BR4000000; default: break;}return BR0;
}std::vector<std::string> SerialPort::list()
{DIR *dir; struct dirent *ent; dir = opendir("/dev");std::vector<std::string> ttyList;while(ent = readdir(dir), ent != nullptr){if("tty" == std::string(ent->d_name).substr(0, 3)){ttyList.emplace_back(ent->d_name);}}return ttyList;
}
bool operator==(const SerialPort::OpenOptions& lhs, const SerialPort::OpenOptions& rhs)
{return lhs.autoOpen == rhs.autoOpen && lhs.baudRate == rhs.baudRate && lhs.dataBits == rhs.dataBits && lhs.parity == rhs.parity && lhs.stopBits == rhs.stopBits && lhs.vmin == rhs.vmin && lhs.vtime == rhs.vtime && lhs.xon == rhs.xon && lhs.xoff == rhs.xoff && lhs.xany == rhs.xany;
}
bool operator!=(const SerialPort::OpenOptions& lhs, const SerialPort::OpenOptions& rhs)
{return !(lhs == rhs);
}

main.cpp:

#include "serialport.h"typedef  unsigned char uchar;
int main()
{printf("begin!\n");SerialPort serialPort = SerialPort("/dev/ttyUSB0");printf("connecting!\n");serialPort.open();if(serialPort.isOpen())printf("connected!\n");else {printf("connect failed!\n");return 0;}char* buffer = new char[10];for(int i=0;i<10;i++){buffer[i]='a';}printf("begin write!\n");serialPort.write(buffer,sizeof(char)*10);printf("write end!\n");
//    serialPort.close();
//    serialPort.open();//    int* buffer2= new int[10];
//    int* buffer2;
//    serialPort.read(buffer2,sizeof(int)*10);
//    for(int i=0;i<10;i++)
//    {
//        printf("%d \n",buffer2[i]);
//    }serialPort.close();if(serialPort.isOpen())printf("still connecting!\n");else {printf("connect closed!\n");return 0;}}

http://chatgpt.dhexx.cn/article/TRKVZYyj.shtml

相关文章

Open vSwitch

1 OpenVSwitch 1.1 简介 OpenvSwitch简称OVS,是一个高质量的、多层虚拟交换机&#xff0c;使用开源Apache2.0许可协议&#xff0c;由Nicira Networks开发&#xff0c;主要实现代码为可移植的C代码。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口…

TX12 + ExpressLRS 915MHz RC控制链路配置及问题汇总

TX12 ExpressLRS 915MHz RC控制链路配置及问题汇总 1. 硬件配置1.1 TX12遥控器1.2 发射/接受机 2. 问题汇总2.1 ELRS接收机无法点亮(第一次)2.2 ELRS接收机无法点亮(第二次)2.3 触发EdgeTX固件更新2.4 elrsV2.lua脚本执行失败2.5 ELRS发射机和接收机如何对频2.6 ELRS接收机LED…

DIY基于树莓派的OpenTX航模遥控器(一)

【前言】 在正式讨论OpenTX遥控器之前&#xff0c;先罗列一下自己以往DIY遥控器的经历&#xff0c;正是通过这些不断摸索逐步积累了DIY的经验&#xff0c;以及大部分的驱动代码。基于对Python的热爱&#xff0c;所有制作都是基于Python编程的&#xff0c;虽然对于实时运行系统…

stm32f429 pcb 原理图工程文件 OPENTX遥控器可用

stm32f429 pcb 原理图工程文件 OPENTX遥控器可用。拍下只发stm32f429 pcb工程文件。id664624938682&

基于opentx开源软件,DIY属于自己的uav遥控器

硬件方面&#xff1a;开关&#xff0c;自稳按钮&#xff0c;方向控制遥感&#xff0c;油门遥感&#xff0c;一键降落按钮&#xff0c; 1.根据开源源码找到引脚对应功能&#xff0c;以及实际各模块&#xff0c;按钮等&#xff0c;进行原理图的绘制&#xff0c;出个初板 2…

EdgeTX/OpenTX逻辑开关教程

目录 一、介绍 二、Taranis遥控的逻辑开关屏幕示例 三、Companion软件中的逻辑开关界面 四、开关功能 一、介绍 如果是T-Pro也可先学习本文的逻辑开关原理&#xff0c;这样在进行双击解锁/长按上锁的设置就得心应手了。 ⼿动激活开关标记为 SA 到 SH。在本文示例中SF 是两…

OpenTX学习笔记

一 OpenTX 开源的无线电遥控系统 二 文件夹结构 1 FIRMWARE 您可以将模块或无线广播设备的固件放在此文件夹中。此文件夹中的文件不会自动应用。 2 IMAGES 2.2:BMP重命名为图像&#xff08;IMAGES&#xff09;&#xff0c;以保持Taranis和Horus之间的一致性。您可以将模型和其…

ping通说明什么

ping是icmp ping通说明 网络层&#xff0c;链路层没问题

虚拟机可以ping通主机,主机无法ping通虚拟机的解决方法

虚拟机可以ping通主机&#xff0c;主机无法ping通虚拟机的解决方法 关闭虚拟机防火墙 关闭防火墙后就可以ping通了 如何还无法ping通&#xff0c;将虚拟机重新启动后再尝试。 再次要ping 虚拟机的时候又ping不通了&#xff0c;搞了好久终于发现&#xff0c;只要将网络连接…

Ubuntu无法ping通百度

1 问题 ubuntu在使用ping baidu.com命令时出现未知的服务或名称 2 解决 修改/etc/network/interfaces文件 修改完成之后保存退出 重启网卡 /etc/init.d/networking restart

VirtualBox主机与虚拟机互相ping通的方法

一般情况下&#xff0c;按照VirtualBox默认的配置&#xff0c;主机可以ping通虚拟机&#xff0c;但虚拟机不能ping通主机。需要两端都能ping通的话&#xff0c;需要按照以下配置&#xff1a; 1、连接方法选择“仅主机(Host-Only)网络”。 2、在高级部分&#xff0c;控制芯片不…

为什么 A 能 ping 通 B,B 却不能 ping 通 A ?

有开发小哥咨询了一个问题&#xff0c;记录一下处理过程分享给有需要的朋友。 问题如下&#xff1a; A、B 两台开发服务器连接交换机&#xff0c;并且 A、B 两台服务器的 IP 地址设置为同一个网段&#xff0c;却发现 A 能 ping 通 B &#xff0c;B 却不能 ping 通 A 。 如图&am…

网络何时能ping通?什么情况下不能ping通?

1. 在同一网段内 假设电脑A、B均在192.168.0.X的网络内&#xff0c;两台电脑不需要额外的设置&#xff0c;就可以互相ping通。如果ping不通&#xff0c;可能的原因是&#xff1a; 目标主机的防火墙没关闭目标主机有电脑管家/360等防护软件 2. 在不同网段 如上图&#xff0c;…

主机与虚拟机ping通

主机与虚拟机ping通&#xff0c;之前上课按老师的配置一步一步来&#xff0c;都忘带了脑子&#xff0c;这次自己也可以实现配置自由了。 1.第一步&#xff0c;查看主机ip&#xff0c;cmd->ipconfig 2.设置虚拟机&#xff0c;同一网段 子网ip:我设置为192.168.172.0 子网掩码…

能ping通,TCP就一定能连通吗?

平时&#xff0c;我们想要知道&#xff0c;自己的机器到目的机器之间&#xff0c;网络通不通&#xff0c;一般会执行ping命令。 一般对于状况良好的网络来说&#xff0c;你能看到它对应的loss丢包率为0%&#xff0c;也就是所谓的能ping通。如果看到丢包率100%&#xff0c;也就…

关于虚拟机能ping通主机,而主机不能ping通虚拟机的问题

Ping不通虚拟机或者主机这个问题恐怕让很多同学头疼吧&#xff1f;如果你是关于标题的问题&#xff0c;可以参考一下&#xff0c;如果是其他问题请移步其他博客。当然也欢迎大家前来阅读指正&#xff01;第一次写&#xff0c;写的不好的地方大家多包涵&#xff01; 这个问题是我…

不同网段怎么ping通

A 类地址子网掩码是 255.0.0.0 &#xff0c;也可写作 /8 B 类地址子网掩码是 255.255.0.0 &#xff0c;也可写作 /16 C 类地址子网掩码是 255.255.255.0 &#xff0c;也可写作 /24 。 网段地址是主机号全为 0 的地址&#xff0c;表示某个网段&#xff0c;比如&#xff1a;网段地…

主机无法Ping通虚拟机

VMware主机无法Ping通虚拟机 原因分析 虚拟机未设置成nat网络模式&#xff1b;虚拟机设置成桥接模式&#xff0c;但是未和主机配置统一网段ip&#xff1b;或是主机网卡故障。而具体的虚拟机ping不通主机原因&#xff0c;在不同模式下可能的情况&#xff1a; 1、桥接模式 可能…

两台虚拟机如何ping通

&#xff08;一&#xff09;关闭防火墙&#xff1a; sudo ufw disable &#xff08;二&#xff09;点击菜单栏编辑→虚拟网络编辑器 点击右下角更改设置→选择桥接模式→最后点击确定 &#xff08;三&#xff09;设置两台虚拟机的IP都是自动获取&#xff08;均进行如下操作&a…

linux可以ping通,Linux可以Ping通但不能traceroute

今天闲来无事&#xff0c;想弄清楚学校至百度服务器的网络问题&#xff0c;结果不试不知道&#xff0c;一试吓一跳。完全出乎我的意料。我们学校的网关是172.21.6.254,172.21.4.254和172.21.7.254。发现可以ping通学校网关&#xff0c;却不能traceroute。如下图&#xff1a; 这…