一、设备中一般会用第二串口与外设通信。需要可以配置波特率,实现应用层面的串口读写。
二、代码实现
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <string.h>
#include <sys/select.h>
int nComFd = 0;
int flag = 0;
void signal_handle(int sig)
{
printf("################## get signal: %d\n", sig);
switch(sig) {
case SIGINT:
case SIGKILL:
case SIGTERM:
flag = 1;
break;
default:
break;
}
return;
}
static int uart_init(char *dev)
{
printf("file=%s,func=%s,line=%d\n",__FILE__,__FUNCTION__,__LINE__);
nComFd = open(dev, O_RDWR|O_NOCTTY);
if (nComFd <= 0 )
{
printf("Couldn't open /dev/%s",dev);
return -1;
}else {
printf("open %s success!",dev);
}
return 0;
}
static int uart_set_param(unsigned long bau_rate, unsigned char data_bits, unsigned char parity, unsigned char stop_bits)
{
struct termios newtio;
bzero(&newtio, sizeof(newtio));
if(tcgetattr(nComFd, &newtio) != 0)
{
printf("SetupSerial 1");
return -1;
}
newtio.c_cflag |= CLOCAL |CREAD;
newtio.c_lflag &=~ICANON;
newtio.c_cflag &= ~CSIZE;
newtio.c_oflag &= ~OPOST;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
switch(data_bits)
{
case 5:
newtio.c_cflag |= CS5;
break;
case 6:
newtio.c_cflag |= CS6;
break;
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
default:
newtio.c_cflag |= CS8;
break;
}
switch(parity)
{
case '2':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
break;
case '1':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case '0':
newtio.c_cflag &= ~PARENB;
break;
default:
newtio.c_cflag &= ~PARENB;
break;
}
switch(bau_rate)
{
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 57600:
cfsetispeed(&newtio, B57600);
cfsetospeed(&newtio, B57600);
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;
}
switch(stop_bits)
{
case 1:
newtio.c_cflag &= ~CSTOPB;
break;
case 2:
newtio.c_cflag |= CSTOPB;
break;
default:
newtio.c_cflag &= ~CSTOPB;
break;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 1;
tcflush(nComFd, TCIFLUSH);
if((tcsetattr(nComFd, TCSANOW, &newtio)) != 0)
{
printf("com set error");
return -1;
}
return 0;
}
int main(int argc, char *argv[])
{
int i = 0, ret = -1;
unsigned char char_val[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05};
unsigned char rev_buf[100] = {0x00};
struct timeval timeout;
fd_set u_read;
struct termios opt;
unsigned long baud = 0;
if(argc < 2)
{
printf("Usage: ./uart /dev/ttySAK1 \n");
return -1;
}
signal(SIGINT, signal_handle);
uart_init(argv[1]);
baud = atol(argv[2]);
printf("baudrate=%lu\n", baud);
uart_set_param(baud, 8, 0, 1);
printf("param init is end\n");
while (!flag) {
FD_ZERO(&u_read);
FD_SET(nComFd, &u_read);
timeout.tv_sec = 3;
timeout.tv_usec = 0;
ret = select(nComFd + 1, &u_read, NULL, NULL, &timeout);
if (ret > 0) {
if (FD_ISSET(nComFd, &u_read)) {
int rret = read(nComFd, &rev_buf, 100);
if (rret > 0) {
printf("value from reading:\n");
for (i = 0; i < rret; i++) {
printf("0x%x\n", rev_buf[i]);
}
}else {
printf("read error.\n");
}
}
}else if (0 == ret) {
printf("time out%s.\n", __TIME__);
}else {
printf("select error.\n");
}
}
#ifdef OTHER_WAY
while(!flag)
{
printf("Now I am a sender!!!!\n");
while(1)
{
int ret = write(nComFd, &char_val[i], 1);
if(ret <= 0)
{
printf("%s send data error!\n", argv[1]);
close(nComFd);
return -1;
}else {
printf("Send data to %s success ret = %d value = %02x\n", argv[1], ret, char_val[i]);
}
i++;
if(i == 6)
{
i = 0;
break;
}
sleep(1);
}
printf("Now I am a rev!!!!!\n");
while(1)
{
int ret = read(nComFd, &rev_buf[i], 1);
if(ret <= 0)
{
printf("%s read data error!\n",argv[1]);
close(nComFd);
return -1;
}else {
printf("read data from %s success ret = %d value = %02x\n", argv[1], ret, rev_buf[i]);
}
i++;
if(i == 6)
{
i = 0;
memset(rev_buf, 0, sizeof(rev_buf));
break;
}
}
}
#endif
close(nComFd);
}
属性配置参考:
https://www.huaweicloud.com/articles/52339d7f0d58bac66c0e814a6d8a4225.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)