VxWorks6.8串口示例
时间:2023-07-30 15:37:29
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); //波特率9600 ioctl(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 ,_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
#include
#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
#include
#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:
欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法可以在文末评论一起讨论!
共同学习!
共同进步!