栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux下串口读写通信

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux下串口读写通信

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);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/277211.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号