RS485 vxworks下工控机通讯 C++

1. 需要的设备: 2台工控机(我这是WTN的) 1根交叉485串口线 1个显示屏 1台电脑

2. 操作系统: vxworks

3. 首先看一下工控机里的硬件接口接上没有, 然后设置485com驱动配置, 这里我设成com2为485串口接口,

4.     测试代码思路: 个人理解是这几步, 打开串口    ->    设置串口raw模式 ,清空输入输出的缓冲区    ->   设置波特率,数据位,停止位,校验方式   ->    开始读和写  -.

->把发送代码放其中一个机里  ->  把接收代码放另一个机里

打开串口:

fd = open("/tyC0/O",O_RDWD,O); 其中"/tyC0/O"串口1的设备名,O_RDWD:open for reading and writing

设置串口raw模式,设置串口raw模式 ,清空输入输出的缓冲区 

ioctl (fd,FIOSETOPTIONS,OPT_RAW);

ioctl (fd,FIOFLUSH,0);

ioctl (int fd , int function , int arg);这个函数解析可以百度一下,主要是function这个参数

设置波特率,数据位,停止位,校验方式  

STOPB:两位停止位,默认是1位停止位.RARENB是使能校验,RARODD是奇校验,使能后默认是偶校验,未使能则是无校验

CS5,CS6,CS7,CS8: 5,6,7,8位是数据位

如: CS8 | RARENB:8位数据位,1位停止位,偶校验

CS8 | RARENB | RARODD:8位数据位,1位停止位,奇校验

CS8 | STOPB : 8位数据位,2位停止位,无校验

开始读和写

int read (int fd , char * buffer  ,  size_t  nbytes)

int write (int fd , char * buffer  ,  size_t  nbytes)

参数含义,参考tty 和 xxDrv:

fd: file descriptor from which to read or write

char * buffer : buffer to receive bytes or to be writen

size_t  nbytes : number of bytes

5. 代码部分:

头文件:

#include <stdio.h>
#include <sioLib.h>
#include <ioLib.h>
#include "tty.h"

#include <iostream>

串口配置部分:

int tty_Init(int fd,int baud,int databits,int stopbits,int parity);
int  tty_Open(int port,int baud,int databits,int stopbits,int parity)
{
int fd;
char portName[20];
if ( sprintf(portName,"%s%d","/tyCo/",port) == ERROR)
{
printf("failed to get portName!\n");
return ERROR;
}
if ( (fd = open(portName,O_RDWR|O_NONBLOCK,0)) == ERROR)
{
printf("faild to open COM!\n");
return ERROR;
}
ioctl(fd,FIOSETOPTIONS,OPT_RAW);
ioctl(fd,FIOFLUSH,0);
if ( tty_Init(fd,baud,databits,stopbits,parity) == ERROR )
{
printf("failed to initial!\n");
return ERROR;
}
return fd;
}


void setBaud(int device,int baud)
{
if ( ioctl(device,SIO_BAUD_SET,baud) )
{
printf("can not set BAUDRATE!\n");
}
}


int tty_Init(int fd,int baud,int databits,int stopbits,int parity)
{
unsigned int  option;
unsigned char data; 
switch (databits) {
case 5:
data = CS5;
break;
case 6:
data = CS6;
break;
case 7:
data = CS7;
break;
case 8:
data = CS8;
break;
default:
printf("error STOPBITS!\n");
break;
}  


if ( ioctl(fd,SIO_HW_OPTS_GET,(int)&option) )
{
printf("can not get OPT!\n");
return ERROR;
}
option &= ~CSIZE;
option |= data;
option &= ~STOPB;


if(stopbits == 2)
option |= STOPB;  
option &= ~(PARENB|PARODD);
if (parity == PARENB)
option|=PARENB;
if (parity == PARODD)                                                                                                                                     
option |= PARODD;  


setBaud(fd,baud);


if(ioctl(fd,SIO_HW_OPTS_SET,option))
{
printf("can not set OPT!\n");
return ERROR;
}
return 0;



int  tty_Send(int fd,char pData[],int length)
{
return  write(fd,pData,length);
}


int tty_Recv(int fd,char buff[],int length)
{
int bytes_in = 0;  
int len = 0;
char buf = 0;
while( (bytes_in = read(fd,&buf,sizeof(buf))) > 0 )
{
buff[len] = buf;                  
len++;  
if(len >= length) break;         
}
return len;
}


void tty_Close(int fd)
{
close(fd);
return;
}

发送与接收部分:


//void sendRs();
void receFromRs();
int fd;
char buff[12]={0};


int main()
{
// buff[1] = 5;
// buff[2] = 5;
// buff[3] = 5;
// buff[4] = 5;
// buff[5] = 5;
// buff[6] = 5;
// buff[7] = 5;
printf(">>>");

printf("<<<");

// int i=0;
// while(1)
// {
// i++;
// sendRs();
// printf(">>>%d",i);
// taskDelay(100);
// }
//
// printf(">>>");
receFromRs();
// printf(">>>");

// printf("%d",buff[0]);
// printf("<<<");
return 0;
}


//void sendRs()
//{
//
// fd = tty_Open(1,9600,8,1,0);
// tty_Send(fd,(char*)buff,12);
// printf("send >>>");
// tty_Close(fd);
//}


void receFromRs()
{

//unsigned char buff[13] = {0};
fd = tty_Open(1,9600,8,1,0);//232 改成tty_Open(0,9600,8,1,0)
tty_Recv(fd,(char*)buff,13);
printf("%d,%d,%d,%d,%d,%d,%d,%d",buff[0],buff[1],buff[2],buff[3],buff[4],buff[5],buff[6],buff[7]);
tty_Close(fd);
}

6. 测试现象:

显示屏上接收到8个5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值