VxWorks6.8串口示例
VxWorks6.8串口案例
- VxWorks6.8串口示例
- 串口簡介
- VxWorks串口所需要包含的頭文件
- VxWorks串口配置函數
- open函數
- write函數
- read函數
- Seri_Demo_Qt_Vx
- TestSeri_Demo_Qt_Vx_Demo
- 232串口接線說明
- over:
- "流水周圓,中抱石田,筆耕不綴,其終有豐年"
VxWorks6.8串口示例
大家好我是背鍋俠“IT幻想家”,今天跟大家簡單分享下VxWorks下一個項目的小模塊結合Qt實現的(Vx6.8串口),希望讀者仔細瀏覽,因為筆者從不知道串口是干嘛的一路摸石頭過河走過來的,希望能給你帶來幫助。廢話不多說上干貨!
串口簡介
串行接口(Serial Interface) 簡稱串口,也稱串行通信接口或串行通訊接口(通常指COM接口),是采用串行通信方式的擴展接口,指數據一位一位地順序傳送。
串行接口的特點是通信線路簡單,只要一對傳輸線就可以實現雙向通信(可以直接利用電話線作為傳輸線),從而大大降低了成本,特別適用于遠距離通信,但傳送速度較慢。常見的有一般計算機應用的RS-232(使用 25 針或 9 針連接器)和工業計算機應用的半雙工RS-485與全雙工RS-422。
我這里使用了232和422傳輸方式,在我本人理解這兩種方式根據需求硬件已經做好的傳輸方式(也可以在BIOS設置),我們知道是什么傳輸方式,做到心中有數和如何搭建測試環境,今天在這里教大家個簡單的232-9針連接器的接線方式,一般沒接觸過的拿過來一臉懵逼,好家伙9跟針都不知道是干嘛的,那么我告訴你如果是 232-9針,什么也別管直接找到第2針和第3針用杜邦線回連,這時你就具備環境自己檢測板卡串口模塊是否好用,如果測試程序一定記得把第5跟針要連接上,否則會出現數據不精準的情況(文章底部有貼圖)。
在軟件層面上只需要關注數據位、停止位、奇偶效驗、讀取方式和效率即可;
VxWorks串口所需要包含的頭文件
#include "vxWorks.h" #include "stdIo.h" #include "ioLib.h" #include "sysLib.h" #include "string.h" #include "taskLib.h"VxWorks串口配置函數
ioctl(m_SeriPort,SIO_HW_OPTS_SET, CLOCAL | CS8 | PARODD | PARENB); //8位數據位|1位停止位|偶效驗ioctl(m_SeriPort,FIOBAUDRATE,9600); //波特率9600ioctl(m_SeriPort,FIOSETOPTIONS,OPT_RAW); //設置串口raw模式 ioctl(m_SeriPort,FIOFLUSH,0); //清空輸入輸出的緩沖區open函數
#define SERI_NAME "/tyCo/0" int m_SeriPort = open(SERI_NAME ,O_RDWR,0); int m_SeriPort = open(SERI_NAME ,O_WRONLY,0);write函數
char* sendData; int writeCom = write(m_SeriPort, sendData,strlen(sendData));read函數
char data; int readCom = read(m_SeriPort,&data,1);Seri_Demo_Qt_Vx
#ifndef THREAD_H #define THREAD_H #include <QThread> #include <QDebug> #include "vxWorks.h" #include "stdIo.h" #include "ioLib.h" #include "sysLib.h" #include "string.h" #include "taskLib.h" class Thread : public QThread {Q_OBJECT public:explicit Thread(QObject *parent = 0);~Thread();void run(); //重寫run函數 public:bool openSeri(QString comPort,int baudRate); //打開串口void closeSeri(); //關閉串口void writeSeri(char* sendData); //發送數據void setFlag(bool flag = true); //線程數據標志位 signals:void RecvData(char data); private:bool seriStop; //讀取數據標志位 true讀取數據 false退出循環int m_SeriPort; //串口文件描述符QString m_SeriName; //串口名int m_baud; //波特率 }; #endif //THREAD_H #include "thread.h"Thread::Thread(QObject *parent) : QThread(parent) { }Thread::~Thread() { }void Thread::run() {sysClkRateSet(1000);char rData;while(1){int readCom = read(m_SeriPort,&rData,1);if(readCom > 0){printf("%c\n",rData);emit RecvData(rData);if(seriStop == false){qDebug()<< "isStop == false break";break;}}else{taskDelay(10);}} } bool Thread::openSeri(QString comPort, int baudRate) {this->m_SeriName = comPort;this->m_baud = baudRate;qDebug()<< "Thread::openSeri" << comPort.toUtf8().data() << baudRate;m_SeriPort = open(comPort.toUtf8().data(),O_RDWR,0); if(m_SeriPort == ERROR){qDebug()<< "open :" << comPort.toUtf8().data() << " = " <<m_SeriPort << "failed !";return false;}ioctl(m_SeriPort,SIO_HW_OPTS_SET, CLOCAL | CS8 | PARODD | PARENB); ioctl(m_SeriPort,FIOBAUDRATE,baudRate); ioctl(m_SeriPort,FIOSETOPTIONS,OPT_RAW); ioctl(m_SeriPort,FIOFLUSH,0);qDebug()<< "open :" << comPort.toUtf8().data() << " = " << m_SeriPort << "succeeded !";return true; } void Thread::closeSeri() {if(seriStop == false){qDebug()<< "Thread::closeSeri";close(m_SeriPort);} } void Thread::writeSeri(char* sendData) {if(m_SeriPort == ERROR) {openSeri(m_SeriName,m_baud);}int writeCom = write(m_SeriPort, sendData,strlen(sendData)); qDebug()<< sendData << writeCom; }void Thread::setFlag(bool flag) {this->seriStop = flag; qDebug()<< "Thread::setFlag" << flag; }TestSeri_Demo_Qt_Vx_Demo
#ifndef SERI_H #define SERI_H#include <QObject> #include <QDebug> #include "thread.h"class Seri : public QObject {Q_OBJECT public:explicit Seri(QObject *parent = 0);~Seri(); public:/* open_Seri 打開串口* comName 串口名* comBaud 串口波特率* return 成功 true 失敗 false*/bool open_Seri(QString comName,int comBaud);/* write_Seri 發送數據* comData 發送數據內容*/void write_Seri(QByteArray comData);/* * close_Seri 關閉串口*/ void close_Seri(); signals:send_Seri(char data); private:Thread* m_pThread;};#endif // SERI_H #include "Seri.h"Seri::Seri(QObject *parent) : QObject(parent) {m_pThread = new Thread; } Seri::~Seri() {if(m_pThread){delete m_pThread;m_pThread=NULL;} } bool Seri::open_Seri(QString comName,int comBaud) {if(m_pThread->openSeri(comName,comBaud))//如果打開成功{m_pThread->setFlag(true);m_pThread->start();}return false; } void Seri::write_Seri(QByteArray comData) {m_pThread->writeSeri(comData.data()); } void Seri::close_Seri() {if(m_pThread->isRunning())//如果線程還在運行 --> 退出循環接收數據 --> 關閉串口 --> 退出線程 --> 回收線程{m_pThread->setFlag(false);m_pThread->closeSeri();m_pThread->quit();m_pThread->wait();} }程序代碼說明:
1.thread類為配置串口類
2.seri類為外部使用類
3.接收到的數據是利用信號槽為接口把數據傳輸出去
232串口接線說明
RS232串口接線方法:直連和交叉接法
一般情況下,設備和電腦的連接通訊,需用到RS232串口線直連線;而設備和設備的連接通訊,就會用到RS232串口線的交叉線。用戶在選擇的時候,應根據兩個設備之間連接的實際情況,選擇不同接法的RS232串口線。
over:
歡迎大家關注作者在文末評論、點贊、轉發以及批評指正! 如果大家有更好的方法可以在文末評論一起討論! 共同學習! 共同進步!“流水周圓,中抱石田,筆耕不綴,其終有豐年”
總結
以上是生活随笔為你收集整理的VxWorks6.8串口示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字转科学计数法
- 下一篇: Codeforces 704D Capt