usb转串口的通信demo
正文之前:
经过这段时间的狠查资料,很感谢那些愿意分享技术的大佬们,像他们学习;
借鉴链接:https://blog.csdn.net/morixinguan/article/details/80898172
直接源码demo:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <asm/termios.h>
//设置停止位
static void set_stopbit (struct termios *opt, const char *stopbit)
{
if (0 == strcmp (stopbit, "1")) {
opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
} else if (0 == strcmp (stopbit, "1")) {
opt->c_cflag &= ~CSTOPB; /* 1.5 stop bit */
} else if (0 == strcmp (stopbit, "2")) {
opt->c_cflag |= CSTOPB; /* 2 stop bits */
} else {
opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
}
}
//设置校验位
static void set_parity (struct termios *opt, char parity)
{
switch (parity) {
case 'N': /* no parity check */
opt->c_cflag &= ~PARENB;
break;
case 'E': /* even */
opt->c_cflag |= PARENB;
opt->c_cflag &= ~PARODD;
break;
case 'O': /* odd */
opt->c_cflag |= PARENB;
opt->c_cflag |= ~PARODD;
break;
default: /* no parity check */
opt->c_cflag &= ~PARENB;
break;
}
}
//设置数据位
static void set_data_bit(struct termios *opt, unsigned int databit)
{
opt->c_cflag &= ~CSIZE;
switch (databit) {
case 8:
opt->c_cflag |= CS8;
break;
case 7:
opt->c_cflag |= CS7;
break;
case 6:
opt->c_cflag |= CS6;
break;
case 5:
opt->c_cflag |= CS5;
break;
default:
opt->c_cflag |= CS8;
break;
}
}
//set 波特率
static void set_baudrate (struct termios *opt, unsigned int baudrate)
{
cfsetispeed(opt, baudrate);
cfsetospeed(opt, baudrate);
}
static int set_serial(int fd,struct termios* opt)
{
set_baudrate(opt,9200);
opt->c_cflag |= CLOCAL | CREAD;
set_data_bit(opt,8);
set_parity(opt,'N');
set_stopbit(opt, "1");
//其他设置
opt->c_oflag = 0;
opt->c_lflag |= ICANON;
opt->c_oflag &= ~OPOST;
opt->c_cc[VTIME] = 0; // 规范模式
opt->c_cc[VMIN] = 0; // 规范模式
tcflush (fd, TCIOFLUSH);
return (tcsetattr (fd, TCSANOW, opt));
}
int main (int argc, char *argv[])
{
int fd;
int len, i,ret;
char rbuf[1024]={0};;
char wbuf[] = "hello!\n"; //此处的"\n"作用是让read每次收到数据就显示
const char* DEV_NAME;
//linux串口驱动的默认属性值(9600,8n1,无流控)
struct termios termios_opt;
//可读可写
#ifdef WRITE
DEV_NAME = "/dev/ttyACM0"; //A设备
#elif READ
DEV_NAME = "/dev/ttyGS0"; //B设备
#endif
fd = open(DEV_NAME, O_RDWR | O_NOCTTY);
if(fd < 0) {
perror(DEV_NAME);
return -1;
}
//设置串口信息
ret = set_serial(fd, &termios_opt);
printf("set serial:%d\n",ret);
#ifdef WRITE
len = write(fd, wbuf, sizeof(wbuf));
if (len < 0) {
printf("write data error \n");
}
printf("write data success: %d \n",len);
#elif READ
while(1){
tcflush (fd, TCIOFLUSH); //清空串口的read缓冲区-底层
memset(rbuf, 0, sizeof(rbuf)); //置0, ----应用层,避免上次buf数据干扰
len = read(fd, rbuf, sizeof(rbuf));
if (len < 0) {
printf("read error \n");
return -1;
}
printf("%d: %s", len, rbuf);
}
#endif
close(fd);
return(0);
}

浙公网安备 33010602011771号