Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美精品免费在线,欧美精品网址,久操免费在线观看

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線(xiàn):

          功能強(qiáng)大的串口工具,抓緊收藏!

          開(kāi)源精選》是我們分享Github、Gitee等開(kāi)源社區(qū)中優(yōu)質(zhì)項(xiàng)目的欄目,包括技術(shù)、學(xué)習(xí)、實(shí)用與各種有趣的內(nèi)容。本期推薦的是一個(gè)功能強(qiáng)大的串口工具。支持Lua自動(dòng)化處理、串口調(diào)試、串口監(jiān)聽(tīng)、串口曲線(xiàn)、TCP測(cè)試、MQTT測(cè)試、編碼轉(zhuǎn)換、亂碼恢復(fù)等功能。

          功能列表

          • 其他串口調(diào)試功能具有的功能
          • 收發(fā)日志清晰明了,可同時(shí)顯示HEX值與實(shí)際字符串
          • 自動(dòng)保存串口與Lua腳本日志,并附帶時(shí)間
          • 串口斷開(kāi)后,如果再次連接,會(huì)自動(dòng)重連
          • 發(fā)送的數(shù)據(jù)可被用戶(hù)自定義的Lua腳本提前處理
          • 右側(cè)快捷發(fā)送欄,快捷發(fā)送條目數(shù)量不限制
          • 右側(cè)快捷發(fā)送欄,支持10頁(yè)數(shù)據(jù),互相獨(dú)立
          • 可獨(dú)立運(yùn)行Lua腳本,并擁有定時(shí)器與協(xié)程任務(wù)特性(移植自合宙Luat Task架構(gòu))
          • 可選文字編碼格式
          • 終端功能,直接敲鍵盤(pán)發(fā)送數(shù)據(jù)(包含ctrl+字母鍵)
          • 可單獨(dú)隱藏發(fā)送數(shù)據(jù)
          • 集成TCP、UDP、SSL測(cè)試服務(wù)端/客戶(hù)端功能,并且支持IPV6
          • 集成各種編碼互轉(zhuǎn)功能
          • 集成亂碼恢復(fù)功能
          • 集成mqtt測(cè)試功能
          • 集成串口監(jiān)聽(tīng)功能,可監(jiān)聽(tīng)其他軟件的串口通信數(shù)據(jù)

          特色功能示范

          使用Lua腳本提前處理待發(fā)送的數(shù)據(jù)

          • 結(jié)尾加上換行回車(chē)
          return uartData.."\r\n"
          • 發(fā)送16進(jìn)制數(shù)據(jù)
          return uartData:fromHex()

          此腳本可將形如30313233發(fā)送數(shù)據(jù),處理為0123的結(jié)果

          • 更多玩法等你發(fā)現(xiàn)
          json = require("JSON")
          t = uartData:split(",")
          return json:encode({
              key1 = t[1],
              key2 = t[2],
              key3 = t[3],
          })

          此腳本可將形如a,b,c發(fā)送數(shù)據(jù),處理為{"key1":"a","key2":"b","key3":"c"}的結(jié)果。

          獨(dú)立的Lua腳本自動(dòng)處理串口收發(fā)

          右側(cè)的Lua腳本調(diào)試區(qū)域,可直接運(yùn)行你寫(xiě)的串口測(cè)試腳本,如軟件自帶的:

          --注冊(cè)串口接收函數(shù)
          uartReceive = function (data)
              log.info("uartReceive",data)
              sys.publish("UART",data)--發(fā)布消息
          end
          
          --新建任務(wù),等待接收到消息再繼續(xù)運(yùn)行
          sys.taskInit(function()
              while true do
                  local _,udata = sys.waitUntil("UART")--等待消息
                  log.info("task waitUntil",udata)
                  local sendResult = apiSendUartData("ok!")--發(fā)送串口消息
                  log.info("uart send",sendResult)
              end
          end)
          
          --新建任務(wù),每休眠1000ms繼續(xù)一次
          sys.taskInit(function()
              while true do
                  sys.wait(1000)--等待1000ms
                  log.info("task wait",os.time())
              end
          end)
          
          --1000ms循環(huán)定時(shí)器
          sys.timerLoopStart(log.info,1000,"timer test")

          甚至你可以利用xlua框架的特性,調(diào)用C#接口完成任何你想做的事情

          request = CS.System.Net.WebRequest.Create("http://example.com")
          request.ContentType = "text/html;charset=UTF-8";
          request.Timeout = 5000;--超時(shí)時(shí)間
          request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36 Vivaldi/2.2.1388.37";
          
          response = request:GetResponse():GetResponseStream()
          
          myStreamReader = CS.System.IO.StreamReader(response, CS.System.Text.Encoding.UTF8);
          
          print(myStreamReader:ReadToEnd())--打印獲取的body內(nèi)容
          
          myStreamReader:Close()
          response:Close()

          使用此功能,你可以完成大部分的自動(dòng)化串口調(diào)試操作。

          示例圖


          -END-

          開(kāi)源協(xié)議:Apache-2.0

          開(kāi)源地址:https://gitee.com/chenxuuu/llcom

          .引言

          本篇介紹ESP32上通過(guò)MicroPython實(shí)現(xiàn)串口數(shù)據(jù)的收發(fā)。

          2.環(huán)境介紹

          2.1.硬件

          ESP32 小板:

          Micro USB線(xiàn):

          USB轉(zhuǎn)TTL:

          2.2.軟件

          1) PC端Wndows系統(tǒng),Python 2.7環(huán)境 或者 Python 3.4以及更新的版本

          2) 板子上Micropython 環(huán)境

          將板子G12引腳和USB轉(zhuǎn)TTL的RXD引腳短接

          將板子G13引腳和USB轉(zhuǎn)TTL的TXD引腳短接

          將板子GND引腳和USB轉(zhuǎn)TTL的GND引腳短接

          3.串口發(fā)送

          代碼如下:

          from machine import UART,Pin
          
          uart = UART(2, baudrate=115200, rx=13,tx=12,timeout=10)
          uart.write("ESP32 uart send example!\r\n")

          運(yùn)行結(jié)果如下,

          完成的功能即:ESP32通過(guò)串口發(fā)送數(shù)據(jù)給USB轉(zhuǎn)TTL

          4.串口接收

          代碼如下:

          from machine import UART,Pin
          
          uart = UART(2, baudrate=115200, rx=13,tx=12,timeout=10)
          
          while True:
              if uart.any():
                  rev_data = uart.read()
                  print(rev_data)

          結(jié)果如下:在左側(cè)窗口里發(fā)送什么,右側(cè)窗口就會(huì)接收到什么。

          完成的功能即:USB轉(zhuǎn)TLL通過(guò)串口發(fā)送數(shù)據(jù)給ESP32


          如果改為:

          from machine import UART,Pin
          
          uart = UART(2, baudrate=115200, rx=13,tx=12,timeout=10)
          
          while True:
              if uart.any():
                  rev_data = uart.read()
                  print(rev_data.decode())

          結(jié)果如下:

          兩者的輸出結(jié)果有差異,這里涉及到Python中bytes和str兩種數(shù)據(jù)類(lèi)型的問(wèn)題,readline函數(shù)的返回值是bytes類(lèi)型。

          strings可以被編碼(encode)成字bytes,bytes也可以解碼(decode)成strings


          更多關(guān)于UART使用可以參考:docs.micropython.org/en/latest/library/machine.UART.html

          5.自發(fā)自收實(shí)驗(yàn)

          cirmall.com/bbs/thread-102657-1-1.html 這里有個(gè)自發(fā)自收的例子,將G12和G13短接在一起。

          運(yùn)行結(jié)果如下:

          使用上一篇介紹的通過(guò) ampy --port COM3 run --no-output uart.py 方法,在串口中可以看到輸出結(jié)果如下:

          細(xì)心的讀者,有沒(méi)有發(fā)現(xiàn)兩者輸出結(jié)果有什么不同嗎?

          如果沒(méi)看出來(lái)的話(huà),提示一下,大家看看Send Byte: 后面有什么不同。

          這個(gè)原因我想了一段時(shí)間,大家知道什么原因嗎,歡迎評(píng)論區(qū)留言。

          、串口介紹

          1.波特率

          衡量通信速度的參數(shù),表示每秒鐘傳送的bit的個(gè)數(shù)。例如9600波特表示每秒鐘發(fā)送9600個(gè)bit。常見(jiàn)的波特率:9600(QSerialPort::Baud9600),19200(QSerialPort::Baud19200),38400(QSerialPort::Baud38400),115200(QSerialPort::Baud115200)

          2.數(shù)據(jù)位

          衡量通信中實(shí)際數(shù)據(jù)位的參數(shù),當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際包含的有效數(shù)據(jù)位個(gè)數(shù)。常見(jiàn)設(shè)置:5(QSerialPort::Data5),6(QSerialPort::Data6),7(QSerialPort::Data7),8(QSerialPort::Data8)

          3.停止位

          用于表示單個(gè)包的最后一位。典型的值為1和2位。常見(jiàn)設(shè)置:1(QSerialPort::OneStop),1.5(QSerialPort::OneAndHalfStop),2(QSerialPort::TwoStop)

          4.奇偶校驗(yàn)位

          串口通信中一種檢錯(cuò)方式。常用的檢錯(cuò)方式有:偶、奇校驗(yàn)。常見(jiàn)設(shè)置:None(QSerialPort::NoParity),Even(QSerialPort::EvenParity),Odd(QSerialPort::OddParity)等

          5.流控

          QT上還提供設(shè)置數(shù)據(jù)流控

          Qt資料領(lǐng)取→「鏈接」

          注:串口數(shù)據(jù)流控

          1.流控制在串行通訊中的作用

          這里講到的“流”,當(dāng)然指的是數(shù)據(jù)流。數(shù)據(jù)在兩個(gè)串口之間傳輸時(shí),常常會(huì)出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象,或者兩臺(tái)計(jì)算機(jī)的處理速度不同,如臺(tái)式機(jī)與單片機(jī)之間的通訊,接收端數(shù)據(jù)緩沖區(qū)已滿(mǎn),則此時(shí)繼續(xù)發(fā)送來(lái)的數(shù)據(jù)就會(huì)丟失。現(xiàn)在我們?cè)诰W(wǎng)絡(luò)上通過(guò)modem進(jìn)行數(shù)據(jù)傳輸,這個(gè)問(wèn)題就尤為突出。流控制能解決這個(gè)問(wèn)題,當(dāng)接收端數(shù)據(jù)處理不過(guò)來(lái)時(shí),就發(fā)出“不再接收”的信號(hào),發(fā)送端就停止發(fā)送,直到收到“可以繼續(xù)發(fā)送”的信號(hào)再發(fā)送數(shù)據(jù)。因此流控制可以控制數(shù)據(jù)傳輸?shù)倪M(jìn)程,防止數(shù)據(jù)的丟失。 pc機(jī)中常用的兩種流控制是硬件流控制(包括rts/cts、dtr/cts等)和軟件流控制xon/xoff(繼續(xù)/停止),下面分別說(shuō)明。

          2.硬件流控制

          硬件流控制常用的有rts/cts流控制和dtr/dsr(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)流控制。

          硬件流控制必須將相應(yīng)的電纜線(xiàn)連上,用rts/cts(請(qǐng)求發(fā)送/清除發(fā)送)流控制時(shí),應(yīng)將通訊兩端的rts、cts線(xiàn)對(duì)應(yīng)相連,數(shù)據(jù)終端設(shè)備(如計(jì)算機(jī))使用rts來(lái)起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設(shè)備的數(shù)據(jù)流,而數(shù)據(jù)通訊設(shè)備(如調(diào)制解調(diào)器)則用cts來(lái)起動(dòng)和暫停來(lái)自計(jì)算機(jī)的數(shù)據(jù)流。

          這種硬件握手方式的過(guò)程為:我們?cè)诰幊虝r(shí)根據(jù)接收端緩沖區(qū)大小設(shè)置一個(gè)高位標(biāo)志(可為緩沖區(qū)大小的75%)和一個(gè)低位標(biāo)志(可為緩沖區(qū)大小的25%),當(dāng)緩沖區(qū)內(nèi)數(shù)據(jù)量達(dá)到高位時(shí),我們?cè)诮邮斩藢ts線(xiàn)置低電平(送邏輯0),當(dāng)發(fā)送端的程序檢測(cè)到cts為低后,就停止發(fā)送數(shù)據(jù),直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將cts置高電平。rts則用來(lái)標(biāo)明接收設(shè)備有沒(méi)有準(zhǔn)備好接收數(shù)據(jù)。常用的流控制還有還有dtr/dsr(數(shù)據(jù)終端就緒/數(shù)據(jù)設(shè)置就緒)。

          3.軟件流控制

          由于電纜線(xiàn)的限制,我們?cè)谄胀ǖ目刂仆ㄓ嵵幸话悴挥糜布骺刂疲密浖骺刂啤R话阃ㄟ^(guò)xon/xoff來(lái)實(shí)現(xiàn)軟件流控制。常用方法是:當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量超過(guò)設(shè)定的高位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出xoff字符(十進(jìn)制的19或control-s,設(shè)備編程說(shuō)明書(shū)應(yīng)該有詳細(xì)闡述),發(fā)送端收到 xoff字符后就立即停止發(fā)送數(shù)據(jù);當(dāng)接收端的輸入緩沖區(qū)內(nèi)數(shù)據(jù)量低于設(shè)定的低位時(shí),就向數(shù)據(jù)發(fā)送端發(fā)出xon字符(十進(jìn)制的17或control- q),發(fā)送端收到xon字符后就立即開(kāi)始發(fā)送數(shù)據(jù)。

          代碼展示

           //初始化波特率
              ui->Net_S_BaudrateCombo->addItem(tr("自定義"));
              ui->Net_S_BaudrateCombo->addItem(QStringLiteral("9600"), QSerialPort::Baud9600);
              ui->Net_S_BaudrateCombo->addItem(QStringLiteral("19200"), QSerialPort::Baud19200);
              ui->Net_S_BaudrateCombo->addItem(QStringLiteral("38400"), QSerialPort::Baud38400);
              ui->Net_S_BaudrateCombo->addItem(QStringLiteral("115200"), QSerialPort::Baud115200);
              ui->Net_S_BaudrateCombo->setCurrentText(tr("38400"));
          
              //初始化數(shù)據(jù)位
              ui->Net_S_DataCombo->addItem(QStringLiteral("5"), QSerialPort::Data5);
              ui->Net_S_DataCombo->addItem(QStringLiteral("6"), QSerialPort::Data6);
              ui->Net_S_DataCombo->addItem(QStringLiteral("7"), QSerialPort::Data7);
              ui->Net_S_DataCombo->addItem(QStringLiteral("8"), QSerialPort::Data8);
              ui->Net_S_DataCombo->setCurrentText(tr("8"));
          
              //初始化停止位
              ui->Net_S_StopCombo->addItem(QStringLiteral("1"), QSerialPort::OneStop);
              ui->Net_S_StopCombo->addItem(tr("1.5"), QSerialPort::OneAndHalfStop);
              ui->Net_S_StopCombo->addItem(QStringLiteral("2"), QSerialPort::TwoStop);
              ui->Net_S_StopCombo->setCurrentText(tr("1"));
          
              //初始化校驗(yàn)位
              ui->Net_S_ChkCombo->addItem(tr("None"), QSerialPort::NoParity);
              ui->Net_S_ChkCombo->addItem(tr("Even"), QSerialPort::EvenParity);
              ui->Net_S_ChkCombo->addItem(tr("Odd"), QSerialPort::OddParity);
              ui->Net_S_ChkCombo->addItem(tr("Mark"), QSerialPort::MarkParity);
              ui->Net_S_ChkCombo->addItem(tr("Space"), QSerialPort::SpaceParity);
              ui->Net_S_ChkCombo->setCurrentText(tr("None"));
          
              //初始化流控
              ui->Net_S_FlowCombo->addItem(tr("None"), QSerialPort::NoFlowControl);
              ui->Net_S_FlowCombo->addItem(tr("RTS/CTS"), QSerialPort::HardwareControl);
              ui->Net_S_FlowCombo->addItem(tr("XON/XOFF"), QSerialPort::SoftwareControl);
              ui->Net_S_FlowCombo->setCurrentText(tr("None"));
          
              //設(shè)置波特率和讀寫(xiě)方向
              qint32 baudRate;
              if (ui->Net_S_BaudrateCombo->currentIndex() == 4){
                  baudRate = ui->Net_S_BaudrateCombo->currentText().toInt();
              }else{
                  baudRate = static_cast<QSerialPort::BaudRate>(ui->Net_S_BaudrateCombo->itemData(ui->Net_S_BaudrateCombo->currentIndex()).toInt());
              }              
              m_serialPort->setBaudRate(baudRate,QSerialPort::AllDirections);
              //數(shù)據(jù)位
              QSerialPort::DataBits dataBits = static_cast<QSerialPort::DataBits>(ui->Net_S_DataCombo->itemData(ui->Net_S_DataCombo->currentIndex()).toInt());           
              m_serialPort->setDataBits(dataBits);
              //停止位
              QSerialPort::StopBits stopBits = static_cast<QSerialPort::StopBits>(ui->Net_S_StopCombo->itemData(ui->Net_S_StopCombo->currentIndex()).toInt());         
              m_serialPort->setStopBits(stopBits);
              //校驗(yàn)位
              QSerialPort::Parity parity = static_cast<QSerialPort::Parity>(ui->Net_S_ChkCombo->itemData(ui->Net_S_ChkCombo->currentIndex()).toInt());   
              m_serialPort->setParity(parity);
              //流控制
              QSerialPort::FlowControl flowControl = static_cast<QSerialPort::FlowControl>(ui->Net_S_FlowCombo->itemData(ui->Net_S_FlowCombo->currentIndex()).toInt());            
              m_serialPort->setFlowControl(flowControl);
          
          
          

          初始化串口

          1、從本機(jī)上查詢(xún)所有串口,并在界面顯示

          QStringList list;
              QList<QSerialPortInfo> serialPortInfoList = QSerialPortInfo::availablePorts();//讀取所有可用的串口信息
              int intID = 0;
              foreach(QSerialPortInfo serialPortInfo,serialPortInfoList)  //打印出端口信息
              {
                  QString strComboShow = (serialPortInfo.portName() + ":" + serialPortInfo.description());
                  ui->Net_S_COMCombo->insertItem(intID,strComboShow,serialPortInfo.portName());
              }
          
          

          QSerialPortInfo 類(lèi)中可獲取串口端口的名稱(chēng),如:COM1,COM2等。還有相關(guān)串口描述。

          2、打開(kāi)串口

             m_serialPort->setPortName("串口名字");//當(dāng)前選擇的串口名字
             if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式嘗試打開(kāi)串口
             {
                  QMessageBox::warning(this, "警告", "打開(kāi)串口失敗");
                  return;
             }
          
          

          3、串口接收數(shù)據(jù)

          // 串口數(shù)據(jù)到來(lái)時(shí),會(huì)觸發(fā)QSerialPort::readyRead事件,添加相應(yīng)的響應(yīng)函數(shù)
          QObject::connect(m_serialPort, &QSerialPort::readyRead, this, &Nahai::serialReceiveData);

          void serialReceiveData()
          {
            QByteArray buffer = m_serialPort->readAll();
            //處理你要處理的數(shù)據(jù)
          
          }
          
          

          4、串口發(fā)送數(shù)據(jù)

           if(m_serialPort->isOpen())
              {
                  m_serialPort->write(baPacket,baPacket.size());//QByteArray baPacket:為你要發(fā)送字節(jié)數(shù)組
              }

          文章轉(zhuǎn)自博客園(Bruce的筆記本):https://www.cnblogs.com/BruceMao/p/15410471.html

          Qt資料領(lǐng)取(視頻教程+文檔+代碼+項(xiàng)目實(shí)戰(zhàn))


          主站蜘蛛池模板: 国产91精品一区二区麻豆网站| 午夜无码一区二区三区在线观看 | 国产日韩精品一区二区在线观看播放| 无码日韩精品一区二区免费| 亚洲AV无码一区二区三区国产 | 果冻传媒一区二区天美传媒| 成人欧美一区二区三区在线视频 | 天堂一区二区三区精品| 久久亚洲AV午夜福利精品一区| 痴汉中文字幕视频一区| 中文字幕AV一区二区三区人妻少妇| 国产成人一区二区三区视频免费| 久久精品中文字幕一区| 亚洲AV无码一区二区三区在线观看| 国产一区二区三区播放心情潘金莲 | 亚洲AV无码一区二区三区久久精品 | 色屁屁一区二区三区视频国产 | 一区二区三区在线免费观看视频| 无码中文字幕一区二区三区| 中文精品一区二区三区四区| 亚洲一区二区免费视频| 一区高清大胆人体| 精品永久久福利一区二区| 亚洲一区免费视频| 无码精品不卡一区二区三区| 波多野结衣一区视频在线| 亚洲日韩一区二区三区| 亚洲日韩AV一区二区三区四区 | 国产一区在线视频观看| 国产一区二区三区在线看片| 男人免费视频一区二区在线观看| 日本韩国黄色一区二区三区| 无码人妻精品一区二区三区99不卡 | 国产裸体歌舞一区二区| 高清国产精品人妻一区二区 | 国产三级一区二区三区 | 欧洲精品码一区二区三区| 国产精品盗摄一区二区在线| 一区二区三区中文字幕| 中文字幕精品一区二区精品| 亚洲国产国产综合一区首页|