串口自动检测

 //检测可用串口,并增加到comboBox_PortName
        private void CheckAndAddAvailableSerialPort()
        {
            bool flag = true;
            comboBox_PortName.Items.Clear();
            for (int i = 1; i < 20; i++)
            {
                try
                {
                    serialPort1.PortName = "COM" + i;
                    serialPort1.Open();
                    serialPort1.Close();
                    comboBox_PortName.Items.Add("COM" + i);    
                    if(flag)
                    {
                        flag = false;
                        comboBox_PortName.Text = serialPort1.PortName; 
                    }
                }
                catch 
                { }
               
            }
        }
//
        int availableSerialPortNumber;
        //检测可用串口数量,返回availableSerialPortNumber
        private int CheckAvailableSerialPortNumber()
        {
            availableSerialPortNumber=0;
            //comboBox_PortName.Items.Clear();
            for (int i = 1; i < 20; i++)
            {
                try
                {
                    serialPort1.PortName = "COM" + i;
                    serialPort1.Open();
                    serialPort1.Close();
                    availableSerialPortNumber++;
                }
                catch
                { }
            }
            return availableSerialPortNumber;
        }
<pre name="code" class="csharp">//
 

        //当串口数量变化时,
        static int previousAvailableSerialPortNumbe=0;
        private void timer1_Tick(object sender, EventArgs e)
        {        
            int currentAvailableSerialPortNumber = CheckAvailableSerialPortNumber();
            if (previousAvailableSerialPortNumbe != currentAvailableSerialPortNumber)
            {
                CheckAndAddAvailableSerialPort();
                previousAvailableSerialPortNumbe = currentAvailableSerialPortNumber;
            }
        }
<pre name="code" class="csharp">//
 

        //打开串口
        private void Btn_OpenSerialport_Click(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    timer1.Enabled = true;                         //打开timer1
                    serialPort1.Close();
                    Btn_OpenSerialport.Text = "打开串口";    
                }
                else
                {
                    timer1.Enabled = false;                         //<span style="font-family: Arial, Helvetica, sans-serif;">关闭timer1</span>
                    serialPort1.BaudRate = Convert.ToInt32(comboBox_BandRate.Text);
                    serialPort1.PortName = comboBox_PortName.Text;
                    serialPort1.Open();
                    Btn_OpenSerialport.Text = "关闭串口";
                }
            }
            catch { MessageBox.Show("串口打开失败!"); }

            //是否连接数据库
            if(checkBox_ConnectDataBase.Checked==true)
            {
                ConnectDataBase();
            }
        
        }

要实现Qt程序中串口自动检测,可以使用QSerialPortInfo类来获取当前系统中所有可用的串口信息,并通过信号槽机制来实现串口的动态添加和移除。 具体实现步骤如下: 1. 在Qt项目中添加头文件#include<QSerialPortInfo>。 2. 在需要使用串口的类中定义一个QSerialPortInfo对象,并连接一个定时器信号槽。 3. 在定时器的槽函数中,使用QSerialPortInfo::availablePorts()函数获取当前系统中所有可用的串口信息。然后通过遍历可用串口的方式,判断系统中是否新增了串口或移除了串口。如果新增了串口,则可以将其添加到程序中;如果移除了串口,则可以将其从程序中移除。 下面是一个简单的示例代码: ```c++ #include <QSerialPortInfo> #include <QTimer> class SerialPortManager : public QObject { Q_OBJECT public: SerialPortManager(QObject *parent = 0); ~SerialPortManager(); public slots: void checkSerialPort(); private: QList<QSerialPortInfo> m_currentPorts; QTimer *m_timer; }; SerialPortManager::SerialPortManager(QObject *parent) : QObject(parent) { m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(checkSerialPort())); m_timer->start(1000); // 每秒检测一次串口 } SerialPortManager::~SerialPortManager() { m_timer->stop(); delete m_timer; } void SerialPortManager::checkSerialPort() { QList<QSerialPortInfo> ports = QSerialPortInfo::availablePorts(); if (ports.count() == m_currentPorts.count()) { // 串口数量没有变化,不需要处理 return; } // 遍历所有可用串口 foreach (QSerialPortInfo port, ports) { if (!m_currentPorts.contains(port)) { // 新增了一个串口 qDebug() << "Add serial port:" << port.portName(); // TODO: 在程序中添加该串口 m_currentPorts.append(port); } } // 遍历当前已有串口 foreach (QSerialPortInfo port, m_currentPorts) { if (!ports.contains(port)) { // 移除了一个串口 qDebug() << "Remove serial port:" << port.portName(); // TODO: 在程序中移除该串口 m_currentPorts.removeOne(port); } } } ``` 在上述代码中,checkSerialPort()函数会每秒检测一次系统中可用的串口,并根据串口数量的变化来判断是否新增或移除了串口。如果新增了串口,则会输出该串口的名称,并将其添加到m_currentPorts列表中;如果移除了串口,则会输出该串口的名称,并将其从m_currentPorts列表中移除。程序中的TODO注释部分需要根据实际情况来实现,可以调用相应的函数来添加或移除串口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值