This repository has been archived on 2026-04-08. You can view files and clone it, but cannot push or open issues or pull requests.
SP713_CPP_QT/drivers/uart/drv_uart.cpp
2025-07-17 13:10:47 +08:00

156 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "drv_uart.h"
#include <QDateTime>
#include <QDebug> // 用于调试输出
#include <QThread>
DRV_Uart::DRV_Uart(QObject *parent)
: QObject(parent) // 假设有8个通道
{
}
DRV_Uart::~DRV_Uart()
{
}
// 枚举当前的所有UART设备返回搜索到的设备数目
ULONG DRV_Uart::Uart_enumDevice()
{
ULONG i;
mDeviceInforS DevInfor = {0};
// 当前设备数目清零
this->m_DRV_Uart_Infors.ulDevCnt = 0;
// 依次搜索设备
for(i=0;i<16;i++)
{
// 打开设备
if(CH347Uart_Open(i) != INVALID_HANDLE_VALUE)
{
// 获取设备信息
CH347Uart_GetDeviceInfor(i,&DevInfor);
// 格式化设备名称
sprintf(this->m_DRV_Uart_Infors.bDeviceName[this->m_DRV_Uart_Infors.ulDevCnt], "%d# %s", i,DevInfor.FuncDescStr);
// 输出设备名称
DbgPrint("UART:%s.", this->m_DRV_Uart_Infors.bDeviceName[this->m_DRV_Uart_Infors.ulDevCnt]);
// copy设备信息至SpiI2cDevInfor结构体
memcpy(&this->m_DRV_Uart_Infors.UartDevInfor[this->m_DRV_Uart_Infors.ulDevCnt], &DevInfor,sizeof(DevInfor));
// 设备数量自增
this->m_DRV_Uart_Infors.ulDevCnt++;
}
// 关闭设备
CH347CloseDevice(i);
}
return this->m_DRV_Uart_Infors.ulDevCnt;
}
//打开设备
BOOL DRV_Uart::Uart_openDevice(ULONG UartIndex)
{
// 判断设备的索引是否在正确的范围内,否则直接跳出
if((this->m_DRV_Uart_Infors.ulDevCnt == 0) || (UartIndex >= this->m_DRV_Uart_Infors.ulDevCnt))
{
DbgPrint("Failed to open the device. Please refresh device first!");
return FALSE;
}
// 打开串口设备
this->m_DRV_Uart_Infors.devIsOpened = (CH347Uart_Open(UartIndex) != INVALID_HANDLE_VALUE);
// 判断是否打开成功
if(this->m_DRV_Uart_Infors.devIsOpened){
// 设置当前的设备索引号
this->m_DRV_Uart_Infors.opendDevIndex = UartIndex;
// 设置默认的延迟时间
CH347Uart_SetTimeout(UartIndex,500,500);
// 设置接收和发送线程
// StopTxThread = FALSE;
// StopRxThread = FALSE;
}
// 显示日志信息
DbgPrint(">>%d#Open Device...%s",UartIndex,this->m_DRV_Uart_Infors.devIsOpened?"Success":"Failed");
return this->m_DRV_Uart_Infors.devIsOpened;
}
//关闭设备
BOOL DRV_Uart::Uart_closeDevice()
{
// 设置接收和发送线程
// StopTxThread = TRUE;
// StopRxThread = TRUE;
// 判断是否打开成功
if(this->m_DRV_Uart_Infors.devIsOpened){
Sleep(300);
CH347Uart_Close(this->m_DRV_Uart_Infors.opendDevIndex);
this->m_DRV_Uart_Infors.devIsOpened = FALSE;
DbgPrint(">>%d#Close device",this->m_DRV_Uart_Infors.opendDevIndex);
}
return TRUE;
}
//设置串口参数
BOOL DRV_Uart::Uart_setPara(ULONG Baudrate, UCHAR StopBits, UCHAR Parity, UCHAR DataSize, UCHAR Timeout)
{
BOOL RetVal = FALSE;
if(this->m_DRV_Uart_Infors.devIsOpened){
RetVal = CH347Uart_Init(this->m_DRV_Uart_Infors.opendDevIndex,Baudrate,DataSize,Parity,StopBits,Timeout);
DbgPrint("Uart_Set %s,Baudrate:%d,DataSize:%d,Parity:%d,StopBits:%d,Timeout:%d",RetVal?"succ":"failure",
Baudrate,DataSize,Parity,StopBits,Timeout);
}
return RetVal;
}
//串口发送数据
BOOL DRV_Uart::Uart_Write(QByteArray &sendData)
{
// 获取数据包的长度
ULONG OutLen = sendData.length();
// 将QByteArray转化为UCHAR
const UCHAR *OutBuf = reinterpret_cast<const unsigned char*>(sendData.constData());
BOOL RetVal = FALSE;
// 调用底层串口发送函数发送数据
RetVal = CH347Uart_Write(this->m_DRV_Uart_Infors.opendDevIndex, (UCHAR *)OutBuf, &OutLen);
// 日志窗口输出调试信息
DbgPrint("frame:%d,Uart_Write %dBytes %s.",sendData.at(14), OutLen,RetVal?"succ":"failure");
return RetVal;
}
//读取串口缓冲区数据大小
LONGLONG DRV_Uart::Uart_readRxBufcnt(void)
{
LONGLONG rxBufSize = 0;
BOOL RetVal = FALSE;
// 调用底层串口接收数据缓冲区的大小
RetVal = CH347Uart_QueryBufUpload(this->m_DRV_Uart_Infors.opendDevIndex, &rxBufSize);
// 日志窗口输出调试信息
DbgPrint("read uart rx buf count:%d.", rxBufSize, RetVal?"succ":"failure");
return rxBufSize;
}
BOOL DRV_Uart::Uart_Read(QByteArray &revData)
{
ULONG InLen = 4096; // 设置读取的长度,读取完后会将该值赋值为真实的长度
UCHAR InBuf[4096] = {0x00};
BOOL RetVal = FALSE;
// 读取串口数据
RetVal = CH347Uart_Read(this->m_DRV_Uart_Infors.opendDevIndex,InBuf,&InLen);
DbgPrint("CH347Uart_Read %dB %s.",InLen,RetVal?"succ":"failure");
if(RetVal)
{
//将数据存入revData变量中返回给调用的函数
revData = QByteArray::fromRawData(reinterpret_cast<const char*>(InBuf), InLen);
}
return RetVal;
}