概述
嵌入式Linux开发过程中,进行Linux串口测试,需要针对串口进行回环测试
或者指定串口接收一定的数据
或者指定串口发送一定的数据
使用该测试用例很快验证硬件串口的稳定性和正确性。
使用代码连接如下
Linux串口测试例程,进行Linux串口测试,需要针对串口进行回环测试;或者指定串口接收一定的数据-嵌入式文档类资源-CSDN文库
这里提供一个很好的测试用例,具体使用
#收发数据测试:
./uart_app /dev/ttyS1 -b 115200 -rw 123asd -asc -l
#发数据测试:
./uart_app /dev/ttyS1 -b 115200 -w 123asd -asc -l
#收数据测试:
./uart_app /dev/ttyS1 -b 115200 -r -asc -l
#其他用法参考如下:
其他用法参考如下help说明:
后缀说明如下
printf("
-asc: read to asciin");
printf("
-b: set buadrate
+ [bps]n");
printf("
[bps] 300 600 1200 2400 4800 9600 19200 38400 57600 115200n");
printf("
-n: write end add entern");
printf("
-l: loopn");
printf("
-ms: write xx ms intervaln");
printf("
-r: read onlyn");
printf("
-w: write only
+ [context]n");
printf("
-rw: read write + [context]n");
printf("
-h: for helpn");
printf("==================================================n");
makefile
#!/bin/bash
CC=arm-linux-gnueabihf-gcc
${CC} uart_app.c -o uart_app
源码如下
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if
( tcgetattr( fd,&oldtio)
!=
0)
{
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag
|=
CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch( nEvent )
{
case 'O':
//奇校验
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
//偶校验
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
//无校验
newtio.c_cflag &= ~PARENB;
break;
}
switch( nSpeed )
{
case 300:
cfsetispeed(&newtio, B300);
cfsetospeed(&newtio, B300);
break;
case 600:
cfsetispeed(&newtio, B600);
cfsetospeed(&newtio, B600);
break;
case 1200:
cfsetispeed(&newtio, B1200);
cfsetospeed(&newtio, B1200);
break;
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 19200:
cfsetispeed(&newtio, B19200);
cfsetospeed(&newtio, B19200);
break;
case 38400:
cfsetispeed(&newtio, B38400);
cfsetospeed(&newtio, B38400);
break;
case 57600:
cfsetispeed(&newtio, B57600);
cfsetospeed(&newtio, B57600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
printf("sorry! [%d bps] is not support ,Set default 9600bps now!n",nSpeed);
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 )
{
newtio.c_cflag &=
~CSTOPB;
}
else if ( nStop == 2 )
{
newtio.c_cflag |=
CSTOPB;
}
newtio.c_cc[VTIME]
= 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
printf("set done!n");
return 0;
}
int open_port(int fd,char *dev)
{
//char *dev[]={"/dev/ttyO1","/dev/ttyO2","/dev/ttyO3"};
long
vdisable;
fd = open( dev, O_RDWR|O_NOCTTY); //open("/dev/tttyS0",O_RDWR | O_NOCTTY);
//O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return(-1);
}
else
{
printf("open %s okn",dev);
}
if(fcntl(fd, F_SETFL, 0)<0)
{
printf("fcntl failed!n");
}
else
{
printf("fcntl=%dn",fcntl(fd, F_SETFL,0));
}
if(isatty(STDIN_FILENO)==0)
{
printf("standard input is not a terminal devicen");
}
else
{
printf("isatty success!n");
}
printf("fd-open=%dn",fd);
return fd;
}
void msdelay(int val){
while(val--)usleep(1000);
}
//#define DEBUG_STR
"ttySC1 554433"
#define Mode_W
1
#define Mode_R
2
#define Mode_RW
3
#define Version
"V1.1"
//const char *default_str = "hello serial test";
int main(int argc ,char **argv)
{
int fd;
int nread,i;
char buff[1024];
int nwrite;
int setmode;
char *wchr;
int format = 0;
int boudrate = 9600;
int enter = 0;
int loop = 0;
int intervalMS = 1000;
printf("n==================================================n");
//printf("argc = %dn",argc);
if((argc < 2) || (!strcmp(argv[1],"-h"))||(!strcmp(argv[1],"help"))){
printf("Version %sn",Version);
printf("[device] [option1] [option2] ....[optionN]n");
printf("option:n");
printf("
-asc: read to asciin");
printf("
-b: set buadrate
+ [bps]n");
printf("
[bps] 300 600 1200 2400 4800 9600 19200 38400 57600 115200n");
printf("
-n: write end add entern");
printf("
-l: loopn");
printf("
-ms: write xx ms intervaln");
printf("
-r: read onlyn");
printf("
-w: write only
+ [context]n");
printf("
-rw: read write + [context]n");
printf("
-h: for helpn");
printf("==================================================n");
return 1;
}
printf("Device [%s] n",argv[1]);
//------------------------------------------------------------
for(i = 1; i < argc; i ++){
if(!strcmp(argv[i],"-asc")){
format = 1;
printf("format asciin");
}else if(!strcmp(argv[i],"-hex")){
format = 0;
printf("format hexn");
}
else if(!strcmp(argv[i],"-b")){
i++;
boudrate = atoi(argv[i]);
}
else if(!strcmp(argv[i],"-n")){
enter = 1;
printf("enter truen");
}
else if(!strcmp(argv[i],"-l")){
loop = 1;
printf("loop truen");
}
else if(!strcmp(argv[i],"-ms")){
i++;
intervalMS = atoi(argv[i]);
}
else if(!strcmp(argv[i],"-w")){
i++;
setmode = Mode_W;
wchr = (char*)argv[i];
printf("write only
w:%sn",wchr);
}
else if(!strcmp(argv[i],"-r")){
printf("read onlyn");
setmode = Mode_R;
}
else if(!strcmp(argv[i],"-rw")){
i++;
setmode = Mode_RW;
wchr = (char*)argv[i];
printf("read write w:%sn",wchr);
}
}
printf("boudrate = %dn",boudrate);
printf("interval : %d msn",intervalMS);
printf("==================================================n");
if((fd=open_port(fd,argv[1]))<0){
perror("open_port error");
return;
}
if((i=set_opt(fd,boudrate,8,'N',1))<0){
perror("set_opt error");
return;
}
while(loop){
switch(setmode){
case Mode_W:
nwrite = sprintf(buff,"%s",wchr);
if(enter){
buff[nwrite++] = 0x0d;
buff[nwrite++] = 0x0a;
}
write(fd,buff,nwrite);
printf("%s write :%sn",argv[1],wchr);
break;
case Mode_R:
nread=read(fd,buff,sizeof(buff));
if(nread>0){
printf("n%s read=%d : ",argv[1],nread);
if(format==0){
for(i = 0; i < nread;i++){
printf("%02x ",buff[i]);
}
printf("n");
}else{
buff[nread] = '