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