int fd = 0;//串口通信句柄
#define RS485_NODE "/dev/uart1" //RS485节点
static pthread_mutex_t g_mtxChipwnd = PTHREAD_MUTEX_INITIALIZER;//加互斥锁
//打开串口句柄
fd = open(RS485_NODE, O_RDWR | O_NOCTTY, 0);
if (-1 == fd)
{
printf("open serial port %s failed.n", RS485_NODE);
return;
}
//串口初始化
if(-1 == serial_init(fd, BAUNDRATE, DATAB8, STOPB1, NOPARITY, NOFLOWCONTROL))
{
return;
}
void sendData2mcu(int fd, int addr)
{
UINT8 cmdData[16] = {0};
int cmdLen = 0;
int iret = 0;
//组装报文
mkData(cmdData, &cmdLen);
//加锁
pthread_mutex_lock(&g_mtxChipwnd);
iret = write(fd, (char *)cmdData, cmdLen);//向串口写入直接用write()
//printf("%d ", iret);
iret = serial_Readn(fd, (char *)cmdData, cmdLen);//从串口读取
pthread_mutex_unlock(&g_mtxChipwnd);
}
//select读取串口返回内容
int serial_Readn(int connfd, char *vptr, int n)
{
int nleft;
int nread;
char *ptr;
struct timeval select_timeout;
fd_set rset;
select_timeout.tv_sec = 10;
select_timeout.tv_usec = 0;
ptr = vptr;
nleft = n;
while (nleft > 0)
{
select_timeout.tv_sec = 10;
select_timeout.tv_usec = 0;
FD_ZERO(&rset);//将你的套节字集合清空
FD_SET(connfd, &rset);//加入你感兴趣的套节字到集合,这里是一个读数据的套节字connfd
//检查套节字是否有数据可读
if(select(connfd+1, &rset, NULL, NULL, &select_timeout) <= 0)
{
break;
}
if((nread = read(connfd, ptr, nleft)) < 0)
{
if(errno==EAGAIN || errno==EWOULDBLOCK || errno==EINTR)
{
nread = 0;
}
else
{
break;
}
}
else if (nread == 0)
{
break;
}
nleft -= nread;
ptr += nread;
}
return(n - nleft);
}