串口介绍
对于linux来说,所有的资源都是文件,串口更是如此,比如龙芯2K1000,可以出12路串口,这些多路串口,在linux系统下就有12个设备节点,/dev/ttyS0~11,对这些节点open,ioctl,read,write即可读写对应的串口.
linux下的串口收发应用程序,向固定串口以固定波特率发送16进制数据,并不断接收
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <error.h>
#include <termios.h>
#include <malloc.h>
#include <sys/types.h>
#include <sys/stat.h>
typedef struct termios termios_t;
typedef struct serial_data{
unsigned char databuf[100];
int serfd;
}ser_Data;
int num = 6;
void *sersend(void *arg);
void *serrecv(void *arg);
int main(int argc,char *argv[])
{
pthread_t pid1,pid2;
pthread_attr_t *pthread_arr1,*pthread_arr2;
pthread_arr1 = NULL;
pthread_arr2 = NULL;
int serport1fd;
termios_t *ter_s = malloc(sizeof(*ter_s));
serport1fd = open(argv[1],O_RDWR | O_NONBLOCK);
if(serport1fd < 0){
printf("%s open faild\r\n",argv[1]);
return -1;
}
bzero(ter_s,sizeof(*ter_s));
ter_s->c_cflag |= CLOCAL | CREAD;
ter_s->c_cflag &= ~CSIZE;
ter_s->c_cflag |= CS8;
ter_s->c_cflag &= ~CSTOPB;
ter_s->c_cflag &= ~PARENB;
ter_s->c_cc[VTIME] = 1;
ter_s->c_cc[VMIN] = 1;
ter_s->c_lflag &=~(ICANON|ECHO|ECHOE);
cfsetispeed(ter_s,B115200);
cfsetospeed(ter_s,B115200);
tcflush(serport1fd,TCIFLUSH);
if(tcsetattr(serport1fd,TCSANOW,ter_s) != 0){
printf("com set error!\r\n");
}
unsigned char buffer[10] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a};
unsigned char recvbuf[100] = {};
ser_Data snd_data;
ser_Data rec_data;
snd_data.serfd = serport1fd;
rec_data.serfd = serport1fd;
memcpy(snd_data.databuf,buffer,10);
pthread_create(&pid1,pthread_arr1,sersend,(void *)&snd_data);
pthread_create(&pid2,pthread_arr2,serrecv,(void *)&rec_data);
ssize_t sizec;
while(1){
usleep(100000);
}
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
free(ter_s);
return 0;
}
void *sersend(void *arg)
{
ser_Data *snd = (ser_Data *)arg ;
printf("send fuction\n");
int ret,i;
while(num--){
sleep(3);
ret = write(snd->serfd,snd->databuf,10);
if(ret > 0){
printf("send success, data len 10\r\n");
for(i=0;i<10;i++)
printf(" 0x%02x",snd->databuf[i]);
printf("\n");
}else{
printf("send error!\r\n");
}
usleep(300000);
}
}
void *serrecv(void *arg)
{
ser_Data *rec= (ser_Data *)arg ;
int ret,i;
while(1){
ret = read(rec->serfd,rec->databuf,1024);
if(ret > 0){
printf("recv success,recv size is %d \r\n",ret );
for(i=0;i<ret;i++)
printf(" 0x%02x",rec->databuf[i]);
printf("\n");
}else{
}
usleep(1000);
}
}
进行测试时,在linux下输入命令即可 ./uart /dev/ttyS2,启动uart为上面应用程序编译后的名字;
未完待续