串口分为RS232和TTL,所以在测试前请先确认自己的串口类型进行测试。下面以海思的一个RS232串口为例说明一下具体的测试过程,串口测试代码参考的为讯为提供的,在其基础上做的调整。
1、确定接口,将RXD与USB转串口模块的TXD相连,将TXD与USB转串口模块的RXD相连,GND直连。这是在硬件上的准备。
2、准备测试代码,将其编译成ELF文件,并拷贝至开发板下,准备运行。
测试源码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int set_opt(int,int,int,char,int);
int main(int argc,const char *argv[])
{
if (argc < 2){
printf("Usage %s 1 or 2 or 3\n",argv[0]);
printf("example:test_uart_argv 0\n");
return 0;
}
int fd,nByte;
char *uart = NULL;
switch (atoi(argv[1]))
{
case 1:
uart = "/dev/ttyAMA1";
break;
case 2:
uart = "/dev/ttyAMA2";
break;
case 3:
uart = "/dev/ttyAMA3";
break;
default:
printf("plz input argv[2] from 1 to 3\n");
break;
}
char buffer[512];
char *uart_out = "please input\r\n";
memset(buffer, 0, sizeof(buffer));
if((fd = open(uart, O_RDWR|O_NOCTTY))<0)
printf("open %s is failed\n",uart);
else{
//set_opt(fd, 115200, 8, 'N', 1);
set_opt(fd, 9600, 8, 'N', 1);
write(fd,uart_out, strlen(uart_out));
while(1){
while((nByte = read(fd, buffer, 512))>0){
buffer[nByte+1] = '\0';
write(fd,buffer,strlen(buffer));
memset(buffer, 0, strlen(buffer));
nByte = 0;
}
}
}
return 0;
}
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 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 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
default:
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\r");
return 0;
}
我是用的是传参方式进行测试,我的需要传3,这需要与自己的设备节点对应即可。
3、开发板下运行编译好的ELF文件,并运行。
4、打开串口助手,打开该串口,我的设置为9600bps,8N1。
5、开始测试,如果每发送一个数据,对应的接收到相同的数据,即证明串口正常。
至此,整个串口的测试完成!