Linux系统下QT编程串口设备号查询不到

接触Linux系统,需要搭建一些串口测试环境:

串口测试可以使用minicom、putty、cutecom;个人建议使用cutecom,使用界面更接近win系统,测试更方便、直观;

测试成功后,基于QT编写自己的测试界面;

使用win系统下移植过来的串口号识别程序(如下所示),发现识别不到对应的串口号:

void WidgetSerial::scanPort()
{
    QList<QSerialPortInfo> portInfo;
    // 获取所有可用的端口信息
    portInfo = QSerialPortInfo::availablePorts();
    if (portInfo.length() == 0) {
        ui->portNameCBox->clear();
        return;
    }
    QStringList portList;
    foreach(const QSerialPortInfo &info, portInfo) {

        portList << info.portName();
    }
    QStringList port;
    for (uchar i = 0; i < ui->portNameCBox->count(); i++) {
        port << ui->portNameCBox->itemText(i);
    }
    if (portList != port) {
        ui->portNameCBox->clear();
        ui->portNameCBox->addItems(portList);
    }
}

1.查询/dev/下的设备,有对应的字符设备文件

2.通过cutecom软件测试,可以找到串口号(需要安装旧版本、新版本同样识别不到)

3.直接指定串口号,serial->setPortName("/dev/tty*"),同样可以成功打开串口

所以串口查询部分需要修改,修改为直接查找/dev/下的设备文件,并判断终端属性,最终查询到了可用的串口;

/* 查询可用串口 */
void WidgetSerial::scanPort()
{
    FILE *fp;
    char buffer[128];
    char tty[32];
    char *line;
    int  i;
   
    fp = popen("ls -l /dev/tty[A-Z]* | awk '{print $10}'", "r");
    
    while(!feof(fp))
    {
        memset(buffer,0,128);
        
        line = fgets(buffer,128,fp);
        if(feof(fp))
            break;
        if(!line)
        {
            perror("Error: ");
            break;
        }
        memset(tty,0,32);
        i = 0;
        while(line[i] != '\n')
        {
            tty[i] = line[i];
            i ++;
        }
        QStringList portList;
        if(check_uart(tty) == 0)
        {
            portList << tty;
        }
    }

    QStringList port;
    for (uchar i = 0; i < ui->portNameCBox->count(); i++)
    {
        port << ui->portNameCBox->itemText(i);
    }
    if (portList != port)
    {
        ui->portNameCBox->clear();
        ui->portNameCBox->addItems(portList);
    }
    pclose(fp);
}
int WidgetSerial::check_uart(char *path)
{
    int ret;
    int fd;
    struct termios option;

    fd = open(path, O_RDONLY);
    if(fd <=0)
    {
#if DEBUG
        printf("Not valid: %s\n", path);
#endif
    }else{
        ret = tcgetattr(fd, &option); /*获取终端相关参数*/
#if DEBUG
        if(!ret)
            printf("tcgetattr: %s, %d\n", path, ret);
#endif
        ::close(fd);/*调用外部close函数,避免与QT内部函数冲突*/
        return ret;
    }
    return -1;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值