📄 test_serial.c
字号:
/*
*vxworks 串口测试
*
* zjx at evoc 2007.5.17
*
*使用方法:
* 1. comrecv ttynum,rate (ttynum表示接收串口号,rate表示波特率)
* 2. comsend ttynum,rate,num (ttynum表示发送串口号,
* rate表示波特率,
* num表示发送字符串的次数)
* 3. 接收端串口收到字符后会保存到serial_result.c 文件中,调用
* comchk 命令,可以查看收到字符串的次数。对比发送
* 字符串的次数就可以观察串口是否正常。
*
*note:
* 实现了两种访问串口的方式
* 1, 不通过驱动,直接IO访问
* 2, read/write 方式。
*/
#include "vxworks.h"
#include "stdio.h"
#include "taskLib.h"
#include "ioLib.h"
#include <end.h>
#include <in.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <semLib.h>
#include <sigLib.h>
#define inportb sysInByte
#define outportb sysOutByte
int COM_PORT[4] = {0xfe000000+0x3f8,0xfe000000+0x2f8,0xfc000000+0x4500,0xfc000000+0x4600};
char buf_send[]="abcdefghijklmnopqrstuvwxyz";
int comsend(int ttynum,int rate, int num);
void comsendTask(int ttynum,int rate, int num);
int comsendio(int ttynum,int rate, int num);
void comsendchar(int ttynum,char c);
int comrec(int ttynum, int rate);
int comrecio(int ttynum, int rate);
int comchk(void);
/*串口发送*/
int comsend(int ttynum, int rate, int num)
{
int fd;
int bytes_out;
char fd_str[8]={0};
char buffer[40] = {0};
int numSend = 1;
assert((num>0)&&(ttynum>0)&&(rate>0));
if(num > 10000000)
{
printf("Number is too big! <10000000 !\r\n");
return ERROR;
}
sprintf(fd_str,"/tyCo/%d", ttynum-1);
fd = open(fd_str,O_RDWR,0);
ioctl(fd,FIOSETOPTIONS,OPT_RAW); /* 设置串口的数据模式 */
ioctl(fd,FIOBAUDRATE,rate); /*设置串口 的波特率*/
printf("The send string is \"%s\" \r\n",buf_send);
FOREVER
{
sprintf(buffer, "[%s(%d)]", buf_send, numSend);
bytes_out = write(fd, buffer, strlen(buffer)); /* 往串口写入一个字符串*/
printf("\r%d", numSend);
numSend++;
if(numSend>num)
{
break;
}
#if 1
taskDelay(5);
#endif
}
/*关闭串口1 */
close(fd);
return OK;
}
/* 读写文件方式*/
int comrec(int ttynum, int rate)
{
int fd,fd1;
int bytes_in,bytes_write;
char buf[40];
char fd_str[8];
assert((ttynum>0)&&(rate>0));
memset(buf, 0 , 40*sizeof(char));
memset(buf, 0 , 8*sizeof(char));
fd1 = creat("serial_result.txt", O_RDWR);
if(fd1<0)
{
printf("creat fd1 failded!\r\n");
return ERROR;
}
sprintf(fd_str,"/tyCo/%d", ttynum-1);
fd=open(fd_str,O_RDWR,0);
ioctl(fd,FIOSETOPTIONS,OPT_RAW); /* 设置串口的数据模式 */
ioctl(fd,FIOBAUDRATE,rate); /*设置串口 的波特率*/
for(;;)
{
memset(buf, 0 , 40*sizeof(char));
/* 读串口*/
bytes_in=read(fd, buf, sizeof(buf_send));
/* 把结果存入文件中*/
bytes_write = write(fd1,buf,strlen(buf));
if(bytes_write<0)
{
printf("write data error \n");
return ERROR;
}
}
close(fd);
close(fd1);
return OK;
}
/*串口发送*/
void comsendTask(int ttynum,int rate, int num)
{
int taskID;
taskID=taskNameToId("sendTask");
if(taskID>0)
{
/* 把访问方式改为中断方式*/
outportb(COM_PORT[ttynum-1]+1,0x01);
taskDelete(taskID);
}
/* 创建发送任务*/
taskSpawn("sendTask",255,0,4000,(FUNCPTR)comsend,ttynum,rate,num,0,0,0,0,0,0,0);
}
/*串口接收*/
void comrecv(int ttynum,int rate)
{
int taskID;
taskID=taskNameToId("comRecvTask");
if(taskID>0)
{
/* 把访问方式改为中断方式*/
outportb(COM_PORT[ttynum-1]+1,0x01);
taskDelete(taskID);
}
/* 创建接收任务*/
taskSpawn("comRecvTask",254,0,4000,(FUNCPTR)comrec,ttynum,rate,0,0,0,0,0,0,0,0);
}
/* 发送一个字符*/
void comsendchar(int ttynum, char c)
{
if(((unsigned char )inportb(COM_PORT[ttynum-1]+5) & 0x20)!= 0)
{
outportb(COM_PORT[ttynum-1], c);
}
taskDelay(1);
}
/* 访问寄存器方式*/
int comsendio(int ttynum,int rate,int count)
{
int i,j;
char countBuffer[10] = {0};
unsigned char c;
assert((ttynum>0)&&(count>0)&&(rate>0));
switch(rate)
{
case 2400: c=0x30;break;
case 4800: c=0x18;break;
case 9600: c=0x0c;break;
case 19200: c=0x06;break;
case 28800: c=0x04;break;
case 38400: c=0x03;break;
case 57600: c=0x02;break;
case 115200: c=0x01;break;
default:
printf("Set comm bps fail!");
return ERROR;
}
outportb(COM_PORT[ttynum-1]+3,0x80); /* DLAB="1", set baud*/
outportb(COM_PORT[ttynum-1],c); /* 波特率 0x30:2400 0x18:4800
0x0c:9600 0x01:115200*/
outportb(COM_PORT[ttynum-1]+1,0x00);
outportb(COM_PORT[ttynum-1]+3,0x03); /* data length: 8 , stop bits: 1*/
outportb(COM_PORT[ttynum-1]+4,0x0b);
outportb(COM_PORT[ttynum-1]+1,0x01); /* receive interrupt enable*/
inportb(COM_PORT[ttynum-1]);
for(i=0; i<count; i++)
{
/*以轮询的方式访问*/
outportb(COM_PORT[ttynum-1]+1,0);
/* 发送字符串,格式为[abedefghijklmnopqrstuvwxyz(12323)] */
comsendchar(ttynum, '[');
for(j=0; j<26; j++)
{
comsendchar(ttynum,buf_send[j]);
}
comsendchar(ttynum, '(');
/* 发送计数值*/
sprintf(countBuffer, "%d", i+1);
for(j=0; j < strlen(countBuffer); j++)
{
comsendchar(ttynum, countBuffer[j]);
}
comsendchar(ttynum, ')');
comsendchar(ttynum, ']');
printf("\r%d", i+1);
}
/* 把访问方式改为中断方式*/
outportb(COM_PORT[ttynum-1]+1,0x01);
return OK;
}
/* 访问寄存器方式*/
int comrecio(int ttynum, int rate)
{
int fd1,bytes_write;
unsigned char c;
char buf[30];
assert((ttynum>0)&&(rate>0));
fd1 = creat("serial_result.txt", O_RDWR);
if(fd1<0)
{
printf("creat fd1 failded!\r\n");
return ERROR;
}
switch(rate)
{
case 2400: c=0x30;break;
case 4800: c=0x18;break;
case 9600: c=0x0c;break;
case 19200: c=0x06;break;
case 28800: c=0x04;break;
case 38400: c=0x03;break;
case 57600: c=0x02;break;
case 115200: c=0x01;break;
default:
printf("Set comm bps fail!");
return ERROR;
}
outportb(COM_PORT[ttynum-1]+3,0x80); /* DLAB="1", set baud*/
outportb(COM_PORT[ttynum-1],c); /*设置 波特率 0x30:2400 0x18:4800 0x0c:9600*/
outportb(COM_PORT[ttynum-1]+1,0x00);
outportb(COM_PORT[ttynum-1]+3,0x03); /* data length: 8 , stop bits: 1*/
outportb(COM_PORT[ttynum-1]+4,0x0b);
outportb(COM_PORT[ttynum-1]+1,0x01); /* receive interrupt enable*/
inportb(COM_PORT[ttynum-1]);
FOREVER
{
memset(buf, 0 , 30*sizeof(char));
/* 以轮询的方式访问*/
outportb(COM_PORT[ttynum-1]+1,0);
/* 读串口*/
if(((unsigned char )inportb(COM_PORT[ttynum-1]+5) & 0x01)!= 0)
{
sprintf(buf,"%c", inportb(COM_PORT[ttynum-1]));
}
/* 把结果存入文件中*/
bytes_write = write(fd1,buf,strlen(buf));
if(bytes_write<0)
{
printf("write data error \n");
return ERROR;
}
}
close(fd1);
return OK;
}
/*串口接收*/
void comrecvio(int ttynum,int rate)
{
int taskID;
taskID=taskNameToId("comRecvTask");
if(taskID>0)
{
/* 把访问方式改为中断方式*/
outportb(COM_PORT[ttynum-1]+1,1);
taskDelete(taskID);
}
/* 创建接收任务*/
taskSpawn("comRecvTask",254,0,4000,(FUNCPTR)comrecio,ttynum,rate,0,0,0,0,0,0,0,0);
}
/* 检查串口收到的字符串的条数*/
int comchk(void)
{
FILE *fd = NULL;
char buffer[40] = {0};
char buffer1[40] = {0};
int len = 0;
int count = 0;
fd = fopen("serial_result.txt", "r");
if(fd<0)
{
printf("opent file error!\r\n");
return ERROR;
}
while(!feof(fd))
{
memset(buffer1, 0 ,sizeof(buffer1));
sprintf(buffer1,"[%s(%d)]", buf_send, count+1);
memset(buffer, 0 ,sizeof(buffer));
fread(buffer, strlen(buffer1), 1, fd);
if(0 == memcmp(buffer, buffer1, strlen(buffer)))
{
count++;
}
}
if(count < 1 )
{
printf("The number of received strings is 0 \r\n");
return ERROR;
}
else
{
printf("The number of received strings is %d\r\n", count-1);
}
fclose(fd);
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -