#include "TirUart.h"
int speed_arr[] = { B2000000, B1500000, B921600, B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
B2000000, B1500000, B921600, B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {2000000, 1500000, 921600, 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300,
2000000, 1500000, 921600, 115200, 38400, 19200, 9600, 4800, 2400, 1200, 300, };
pthread_mutex_t uart_write_lock;
pthread_mutex_t uart_read_lock;
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
if (speed == name_arr[i]) {
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
int UartInit(int fd, int baud,int databits,int stopbits,enum UartCheck mParity)
{
struct termios Opt;
tcgetattr(fd,&Opt);
set_speed(fd,baud);
pthread_mutex_init(&uart_write_lock,NULL);
pthread_mutex_init(&uart_read_lock,NULL);
Opt.c_cflag &= (~CSIZE);
switch (databits)
{
case 5:
Opt.c_cflag |= CS5;
break;
case 6:
Opt.c_cflag |= CS6;
break;
case 7:
Opt.c_cflag |= CS7;
break;
case 8:
Opt.c_cflag |= CS8;
break;
default:
Opt.c_cflag |= CS8;
printf("Unsupported data size/n");
break;
}
switch (mParity)
{
case NO_CHECK:
Opt.c_cflag &= ~PARENB; /* Clear parity enable */
Opt.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case ODD_CHECK:
Opt.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
Opt.c_iflag |= INPCK; /* Disnable parity checking */
break;
case PARITY_CHECK:
Opt.c_cflag |= PARENB; /* Enable parity */
Opt.c_cflag &= ~PARODD; /* 转换为偶效验*/
Opt.c_iflag |= INPCK; /* Disnable parity checking */
break;
default:
printf("Unsupported parity/n");
Opt.c_cflag &= ~PARENB;
Opt.c_cflag &= ~CSTOPB;
break;
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
Opt.c_cflag &= ~CSTOPB;
break;
case 2:
Opt.c_cflag |= CSTOPB;
break;
default:
printf("Unsupported stop bits/n");
return UART_FALSE;
}
Opt.c_cc[VTIME] = 0;
Opt.c_cc[VMIN] = 0; /* Update the options and do it NOW */
Opt.c_cflag |= (CLOCAL | CREAD);
Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
Opt.c_lflag &= ~(ICANON | ISIG | ECHO | IEXTEN);
Opt.c_oflag &= ~OPOST;
Opt.c_oflag &= ~(ONLCR | OCRNL);
Opt.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
if (tcsetattr(fd,TCSANOW,&Opt) != 0)
{
printf("SetupSerial!\n");
close(fd);
return UART_FALSE;
}
return fd;
}
int UartWrite(int uartFd,char * buf,int bufLen)
{
if(uartFd <0){
return UART_FALSE;
}
pthread_mutex_lock(&uart_write_lock);
if(write(uartFd, buf, bufLen) != bufLen){
printf("write uart err\n");
pthread_mutex_unlock(&uart_write_lock);
return UART_FALSE;
};
pthread_mutex_unlock(&uart_write_lock);
return UART_TRUE;
}
int UartRead(int uartFd,char *buff,int bufLen)
{
int nRead = 0;
int ret = 0;
if(uartFd<0) return -1;
ret = myselect(uartFd,1000*1000,READ_SELECT);
if(ret<0){
usleep(1000);
return UART_FALSE;
}else if(ret==0){
return UART_TIMEOUT;
}
pthread_mutex_lock(&uart_read_lock);
nRead = read(uartFd, buff,bufLen);
if(nRead > 0){
buff[nRead]=0x0;
}
pthread_mutex_unlock(&uart_read_lock);
return nRead;
}
int UartOpen(char* UartName,int baud,int databits,int stopbits,enum UartCheck mParity)
{
int comFd=open(UartName, O_RDWR|O_NONBLOCK);
int ret = 0;
char cmdBuf[50]={0};
ret = sprintf(cmdBuf,"stty -F %s %d",UartName,baud);
cmdBuf[ret]=0x0;
system(cmdBuf);
if(comFd<=0){
printf("open %s err\n",UartName);
return UART_FALSE;
}
if(UartInit(comFd,baud,databits,stopbits,mParity)<=0){
return UART_FALSE;
}
return comFd;
}
void UartClose(int *uartFd)
{
if(*uartFd > 0){
close(*uartFd);
*uartFd = 0;
}
}
int myselect(int sockfd, int usec, enum SelectType mtype)
{
struct timeval tv;
fd_set readfds, writefds, exceptfds;
int receive = 0;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
tv.tv_sec = usec/1000000;
tv.tv_usec = usec%1000000;
FD_SET(sockfd, &exceptfds);
if(mtype == READ_SELECT){
FD_SET(sockfd, &readfds);
receive = select(sockfd+1, &readfds, NULL, &exceptfds, &tv);
}else{
FD_SET(sockfd, &writefds);
receive = select(sockfd+1, NULL, &writefds, &exceptfds, &tv);
}
if(receive < 0){
perror("select error:");
return M_FALSE;
}else if(receive == 0) {
return M_TIMEOUT;
}else{
if(mtype == READ_SELECT){
if(FD_ISSET(sockfd, &readfds) > 0)
return M_TRUE;
}else{
if(FD_ISSET(sockfd, &writefds) > 0)
return M_TRUE;
}
return M_FALSE;
}
return M_TRUE;
}
Hi3516D的串口485应用实例
4星 · 超过85%的资源 需积分: 34 79 浏览量
2018-07-26
17:44:51
上传
评论 1
收藏 4KB ZIP 举报
qryx
- 粉丝: 12
- 资源: 25
最新资源
- 课程设计-基于SpringBoot + Mybatis+python爬虫NBA球员数据爬取可视化+源代码+文档+sql+效果图
- 软件品质管理系列二项目策划规范.doc
- 基于TensorFlow+PyQt+GUI的酒店评论情感分析,支持分析本地数据文件和网络爬取数据分析+源代码+文档说明+安装教程
- 软件定义无线电中的模拟电路测试技术.pptx
- 软件开发协议(作为技术开发合同附件).doc
- 软件开发和咨询行业技术趋势分析.pptx
- 软件测试题详解及答案.doc
- 软件漏洞生命周期管理策略.pptx
- 毕业设计-基于Python实现的的简易气温爬虫,可以爬取全国各市的近7日气温数据
- 软件系统测试报告(实用版).doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页