锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

VxWorks6.8串口示例

时间:2023-07-30 15:37:29 tyco连接器176372

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:

欢迎大家关注作者在文末评论、点赞、转发以及批评指正!
如果大家有更好的方法可以在文末评论一起讨论!
共同学习!
共同进步!

“流水周圆,中抱石田,笔耕不缀,其终有丰年”

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章