c语言:
// compile: mipsel-openwrt-linux-gcc uart_write_read.c -o uart_write_read
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <poll.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 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;
}
main()
{
int fd,wr_static,ret,nread,count=0;
char *uart3 = "/dev/ttyS1";
char *buffer = "hello world!\n";
char buff[8];
struct pollfd fds[2];
printf("\r\ni.MX6 uart_write_read_test start\r\n");
if((fd = open(uart3, O_RDWR|O_NOCTTY|O_NDELAY))<0){
printf("open %s is failed",uart3);
}
else {
printf("open %s is success\n",uart3);
set_opt(fd, 115200, 8, 'N', 1);
}
pid_t pid;
pid = fork();
//调用出错
if(pid == -1){
printf("fork failed\n");
return 1;
}
//返回给父进程子进程号,返回值大于0
else if(!pid){
fds[0].fd = STDOUT_FILENO;
fds[0].events = POLLOUT;
ret = poll(fds, 1, 5000);
while(1){
if (ret == 0)
printf("write time out\n");
else{
write(fd,buffer, strlen(buffer));
sleep(1);
}
}
}
//返回子进程0,返回值等于0返回给子进程
else{
fds[1].fd = STDIN_FILENO;
fds[1].events = POLLIN;
ret = poll(fds, 1, 5000);
while(1){
if (ret == 0)
printf("red time out\n");
else{
while((nread = read(fd,buff,8))>0){
count+=nread;
printf("count = %d\n",count);
}
}
}
}
close(fd);
return 0;
}
c++:
// compile: mipsel-openwrt-linux-g++ uart_write_read.cpp -o uart_write_read
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <poll.h>
#include <string>
using namespace std;
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; //超时时间100ms
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;
}
main()
{
int fd,wr_static,ret,nread,count=0;
char uart3[20];
//char *uart3 = "/dev/ttyS1";
//char *buffer = "hello world!\n";
char send_buff[50];
struct pollfd fds[2];
char read_buff[100];
printf("\r\ni.MX6 uart_write_read_test start\r\n");
string s_uart3="/dev/ttyS1";
strcpy(uart3, s_uart3.c_str());
string s_sbuff="hello world!\n";
strcpy(send_buff, s_sbuff.c_str());
if((fd = open(uart3, O_RDWR|O_NOCTTY|O_NDELAY))<0){
printf("open %s is failed",uart3);
}
else {
printf("open %s is success\n",uart3);
set_opt(fd, 115200, 8, 'N', 1);
}
pid_t pid;
pid = fork();
//调用出错
if(pid == -1){
printf("fork failed\n");
return 1;
}
//返回给父进程子进程号,返回值大于0
else if(!pid){
fds[0].fd = STDOUT_FILENO;
fds[0].events = POLLOUT;
ret = poll(fds, 1, 5000);
while(1){
if (ret == 0)
printf("write time out\n");
else{
write(fd,send_buff, strlen(send_buff));
sleep(1);
}
}
}
//返回子进程0,返回值等于0返回给子进程
else{
fds[1].fd = STDIN_FILENO;
fds[1].events = POLLIN;
ret = poll(fds, 1, 5000);
while(1){
if (ret == 0)
printf("red time out\n");
else{
while((nread = read(fd, read_buff, 8))>0){
count+=nread;
printf("count = %d\n",count);
}
}
}
}
close(fd);
return 0;
}