串口编程——概念、开发流程与开机启动程序

一、串口编程概念

1.什么是串口通信

        串口通信是指一次只传送一个数据位。虽然在通信的时候串口有 8 位或者 9 位等,但是在物理层面传输的时候,它仍然是以单个 bit 的方式传输的。

2.什么是串口

        虽然以太网以及 USB 等等也是以串行的方式发送数据,但是串口一般特指 RS232 标准的接口。

3.什么是RS232

        RS-232 是 EIA(Electronic Industries Association)定义的串行通信的电器接口。RS-232事实上有三种(A,B 和 C),它们分别采用不同的电压来表示 on 和 off。最被广泛使用的是RS-232C,它将 mark(on)比特的电压定义为-3V 到-12V 之间,而将 space(off)的电压定义到+3V 到+12V 之间。虽然 RS-232C 标准说信号最远被传输 8m,但事实上你可以使用它传输更长的距离,直到信号波特率已经小到不行了为止。 RS-232 的连结线中除去用来传入传出数据的电线,还有一些用来提供时序,状态和握手的电线。

4.什么是流控

        两个串行接口之间的传输数据流通常需要协调一致才行。这可能是由于用以通信的某个串行接口或者某些存储介质的中间串行通信链路的限制造成的。对于异步数据这里有两个方法做到这一点。

        第一种方法通常被叫做“软件”流控制。这种方法采用特殊字符来开始(XON,DC1,八进制数 021)或者结束(XOFF,DC3 或者八进制数 023)数据流。而这些字符都在 ASCII 中定义好了。虽然这些编码对于传输文本信息非常有用,但是它们却不能被用于在特殊程序中的其他类型的信息。

        第二种方法叫做“硬件”流控制。这种方法使用 RS-232 标准的 CTS 和 RTS 信号来取代之前提到的特殊字符。当准备就绪时,接受一方会将 CTS 信号设置成为 space 电压,而尚未准备就绪时它会被设置成为 mark 电压。相应得,发送方会在准备就绪的情况下将 RTS 设置成 space电压。正因为硬件流控制使用了于数据分隔的信号,所以与需要传输特殊字符的软件流控制相比它的速度很快。但是,并不是所有的硬件和操作系统都支持 CTS/RTS 流控制。

二、串口编程开发流程

在 linux 下串口编程流程比较容易理解,如下图所示:

         打开串口,一般使用 open 函数,打开之后会返回句柄,这个句柄就可以提供给发送和接收函数使用。串口本质上也是字符设备,但是串口是属于一种比较特殊的字符设备。

        初始化串口,串口需要配置波特率,数据位,校验位等等一系列的参数,初始化的过程掌握了,发送和接收都比较容易实现。虽然初始化比较麻烦,但是无论是在 window 下还是在 linux下,串口的初始化都是很容易找到例程的。个人建议只要能够读懂代码,根据实际需求进行验证和配置即可。

        发送和接收数据,前面提到过串口是属于字符设备的,可以使用 read 函数和 write 函数实现。

        关闭,使用函数 close 即可关闭串口。

三、程序的开机自启动

         1.如下图所示,使用拷贝命令“cp -r /mnt/udisk/helloworld /bin/”将其拷贝到/bin目录下,然后使用 ls 命令确认一下。

        2.使用命令“chmod 777 /bin/helloworld”修改权限。

        3.接着使用命令“vi /etc/init.d/rcS”打开文件系统的启动文件,接着进入文件的最后一行,添加“/bin/helloworld &”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QT5串口编程可以用于编写简单的上位机,通过串口与下位机进行通信。下面是一个简单的上位机编写示例: 首先,要在QT项目中加入串口模块,可以通过在.pro文件中加入以下代码实现: ``` QT += serialport ``` 接下来,创建一个新的类,命名为SerialPort,继承自QObject,并添加以下代码: ```cpp #include "serialport.h" SerialPort::SerialPort(QObject *parent) : QObject(parent) { serial = new QSerialPort(this); connect(serial, &QSerialPort::readyRead, this, &SerialPort::readData); } void SerialPort::openPort(QString portName, qint32 baudRate) { serial->setPortName(portName); serial->setBaudRate(baudRate); if(serial->open(QIODevice::ReadWrite)) { qDebug() << "Serial port is open"; } else { qDebug() << "Serial port failed to open"; } } void SerialPort::closePort() { if(serial->isOpen()) { serial->close(); qDebug() << "Serial port is closed"; } } void SerialPort::readData() { QByteArray data = serial->readAll(); qDebug() << "Received data: " << data; // 在这里可以对接收到的数据进行处理 } void SerialPort::writeData(QByteArray data) { if(serial->isOpen()) { serial->write(data); qDebug() << "Sent data: " << data; } else { qDebug() << "Serial port is not open"; } } ``` 在主窗口中,可以使用SerialPort类的实例来控制串口的打开、关闭和数据的读写,可以通过按钮来触发相应的操作。下面是一个简单的主窗口实现: ```cpp #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); serialPort = new SerialPort(this); connect(ui->openButton, &QPushButton::clicked, this, &MainWindow::openPort); connect(ui->closeButton, &QPushButton::clicked, this, &MainWindow::closePort); connect(ui->sendButton, &QPushButton::clicked, this, &MainWindow::sendData); } MainWindow::~MainWindow() { delete ui; } void MainWindow::openPort() { QString portName = ui->portComboBox->currentText(); qint32 baudRate = ui->baudRateComboBox->currentText().toInt(); serialPort->openPort(portName, baudRate); } void MainWindow::closePort() { serialPort->closePort(); } void MainWindow::sendData() { QString data = ui->sendLineEdit->text(); serialPort->writeData(data.toUtf8()); ui->sendLineEdit->clear(); } ``` 在QT设计器中,可以创建一个MainWindow窗口,包含一个QComboBox用于选择串口号,一个QComboBox用于选择波特率,一个QLineEdit用于输入发送的数据,以及几个QPushButton用于触发相应的操作。 以上就是一个简单的QT5串口编程的上位机实现,你可以根据具体的需求进行进一步的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琪琪猫不会嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值