接触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;
}