c++跨平台串口库(serial)

c++跨平台串口库(serial)

serial资源链接

创建工程

在这里插入图片描述
工程目录如下:

  • .vscode: 使用vsocde自动生成的
  • 3rd: 里面放第三方库
  • include: 放源代码的头文件
  • src:放源代码

这里我创建了一个简单的demo工程,只有一个main.cpp。

编写CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MAIN)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

# 编译serial库(可见内部头文件,无需手动添加)
add_subdirectory(${PROJECT_SOURCE_DIR}/3rd/serial)

include_directories(${PROJECT_SOURCE_DIR}/include)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_FILES)
add_executable(${PROJECT_NAME} ${SRC_FILES})
# 链接serial
target_link_libraries(${PROJECT_NAME} serial)

对于一个已经使用cmake编译的工程,增加serial库只需要增加这两个命令

add_subdirectory(${PROJECT_SOURCE_DIR}/3rd/serial)

target_link_libraries(${PROJECT_NAME} serial)

使用serial

使用serial就很简单了,在serial::Serial构造函数里就可以设置好串口的参数,一般只需要调用read()或write()函数即可。

#include <iostream>
#include <serial/serial.h>

int main()
{
    // 打开串口
    serial::Serial serial("COM1", 9600, serial::Timeout::simpleTimeout(1000));
    if (!serial.isOpen())
    {
        std::cout << "serial open failed" << std::endl;
        return -1;
    }
    // 读取数据
    while(1)
    {
        int len = serial.available();
        if (len > 0)
        {
            std::string data = serial.read(len);
            std::cout << "read data: " << data << std::endl;
        }
    }
    return 0;
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PComm 函数 PComm 函数是台湾MOXA公司提供的,他为用户提供了基于win32 api的开发接口。 PComm函数分为7大类 控制函数、数据输入函数、数据输出函数、状态函数、事件驱动函数、传输文件函数、特殊设定函数 上述函数均返回int型数据,若函数调用成功则返回0,否则返回一个负整数。 控制函数主要包括 sio_open(PortNum) 打开串口 sio_close(PortNum) 关闭串口 sio_ioctl(PortNum, baud, mode)设置串口的工作模式,包括 波特率,数据位元,停止位,效验等 sio_flush(portNum,func)清除发送、接收缓冲区 其中func 为0清空输入 ,为1清空输出,为2清空输入输出 sio_SetWriteTimeouts(int port,DWORD TotalTimeouts):设置串口写操作的超时。 sio_lctrl(Portnum,mode) 设置串口RTS/DTS。 待定 数据输入函数主要包括 sio_getch(PortNum) 从输入缓冲区读一个字符 sio_read(PortNum,buf,len) 从输入缓冲区读指定个数的字符 sio_iqueue(Portnum)读取输入缓冲区中的字符长度 数据输出函数主要包括 sio_putch(PortNum) 写一个字符到输出缓冲区 sio_write(PortNum,buf,len)写指定个数的字符到输出缓冲区 状态函数主要包括 sio_lstatus(portNum)获取串口的CTS,DSR,DCD,RI线的状态 sio_getbaud(portNum)获取串口的波特率 sio_getmode(portNum)获取串口的工作模式。对应sio_ioct函数 事件函数主要包括 sio_term_irq(portNum,func,code) 当接收到指定字符时响应事件,func为回调函数名,code为指定的字符 sio_cnt_irq(PortNum,func,count) 当接收到指定个数字元时响应事件,func为回调函数名,count接收的个数 传输文件函数主要包括 sio_FtASCIITx(portNum,fname,func,key)发送一个文本文件 sio_FtASCIIRx(portNum,fname,func,Key,sec)接收一个文本文件 int i,Ret,DataLen; FILE *fp1; uchar RetDataC[30],WriteData[24],PSC[5]; Ret = sio_open(port); if (Ret != SIO_OK ) return(-1);//打开串口错误 Ret = sio_ioctl (port, B9600, P_NONE | BIT_8 | STOP_1 ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 } /*Ret = sio_lctrl (port, C_DTR | C_RTS ); if (Ret != SIO_OK) { sio_close(port); return(-2);//设置串口参数失败 }*/ /*Ret = sio_flush(port,2); if (Ret != SIO_OK){ sio_close(port); return(-3);//清空 输入和输出缓冲区的数据 }*/
### 回答1: 以下是一个使用Qt C++框架的GPS读取示例: ```c++ #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QCoreApplication> #include <QDebug> QSerialPort* serial_port; QByteArray buffer; // 解析GGA消息 void parse_gga_message(const QByteArray& message, double& latitude, double& longitude) { // 判断消息类型 if (!message.startsWith("$GPGGA")) { return; } // 切割消息字段 QList<QByteArray> fields = message.split(','); if (fields.size() < 10) { return; } // 解析纬度和经度 latitude = fields[2].left(2).toDouble() + fields[2].mid(2).toDouble() / 60.0; if (fields[3] == "S") { latitude = -latitude; } longitude = fields[4].left(3).toDouble() + fields[4].mid(3).toDouble() / 60.0; if (fields[5] == "W") { longitude = -longitude; } } // 读取GPS数据 void read_gps_data() { if (serial_port->bytesAvailable() <= 0) { return; } // 读取数据 buffer.append(serial_port->readAll()); int index = buffer.indexOf('\n'); while (index >= 0) { QByteArray message = buffer.left(index).trimmed(); buffer = buffer.mid(index + 1); index = buffer.indexOf('\n'); // 解析消息 double latitude, longitude; parse_gga_message(message, latitude, longitude); qDebug() << "Latitude: " << latitude << ", Longitude: " << longitude; } } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 查找可用的串口 QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); if (ports.isEmpty()) { qDebug() << "No serial port found!"; return -1; } // 打开串口 serial_port = new QSerialPort(ports[0]); if (!serial_port->open(QIODevice::ReadOnly)) { qDebug() << "Failed to open serial port!"; return -1; } // 配置串口 serial_port->setBaudRate(QSerialPort::Baud9600); serial_port->setParity(QSerialPort::NoParity); serial_port->setDataBits(QSerialPort::Data8); serial_port->setStopBits(QSerialPort::OneStop); // 读取GPS数据 QObject::connect(serial_port, &QSerialPort::readyRead, read_gps_data); return a.exec(); } ``` 请注意,这只是一个简单的示例,实际应用中可能需要更复杂的解析算法和错误处理机制。同时,还需要根据实际情况调整串口通信的配置和读取方式。 ### 回答2: GPS Qt是一个用于开发GPS应用程序的开源。它使用了Qt框架,并提供了一套用于处理GPS数据的API。通过GPS Qt,开发人员可以轻松地获取GPS设备的数据,并进一步处理和显示这些数据。 GPS Qt的源代码是以C++语言编写的,因此开发人员可以轻松地在自己的项目中集成和使用GPS Qt。源代码包含了各种函数和类,用于处理GPS数据,包括获取经纬度、高度、速度和方向等信息。开发人员可以根据自己的需求,使用这些函数和类来实现不同的功能,比如显示当前位置、路径规划和导航等。 使用GPS Qt的源代码可以帮助开发人员快速开发GPS应用程序,减少了重复代码的编写工作。此外,GPS Qt还提供了一些实用的工具函数和示例代码,帮助开发人员更好地理解和使用GPS Qt。 总之,GPS Qt是一个使用C++语言编写的开源,用于开发GPS应用程序。源代码提供了一套用于处理GPS数据的API,并包含了各种函数、类和示例代码。通过使用GPS Qt,开发人员可以轻松地实现各种GPS功能,如获取位置信息、路径规划和导航等。 ### 回答3: GPS Qt C 源代码是使用Qt编写的用于处理GPS数据的代码。Qt是一个跨平台C++应用程序开发框架,可以用于开发各种类型的应用程序,包括移动应用程序、桌面应用程序和嵌入式系统。 在GPS Qt C 源代码中,通常会包含以下几个主要模块: 1. GPS数据获取:代码会调用系统API或者使用Qt提供的串口通信,与GPS设备进行通信,获取实时的GPS数据。这些数据包括经度、纬度、海拔高度、速度等信息。 2. 数据解析和处理:获取到GPS数据后,代码会对数据进行解析和处理。例如,将经度和纬度转换为地理位置信息,计算两个位置之间的距离或者方向等等。 3. 地图显示和交互:代码会使用Qt提供的图形界面来显示地图,并在地图上标记当前位置、目标位置等点。用户可以通过界面与地图交互,例如拖拽地图、放大缩小、选择目标位置等操作。 4. GPS导航功能:代码还可以实现GPS导航功能,根据当前位置和目标位置,计算出最优路线,并提供路线规划和导航指引。 总之,GPS Qt C 源代码是用Qt编写的用于处理GPS数据的代码,具备获取GPS数据、解析处理、地图显示和交互、导航功能等特点。这种代码可以用于开发各种类型的GPS应用程序,如地图导航、轨迹记录、位置服务等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值