Linux下实现串口同时收发

创建发送线程函数

void *send_data(void *arg) {
    char *SendBuf = "1111";
    int SendLen;
    unsigned long counter = 0;

    while (running) {
        SendLen = PortSend(fdcom, SendBuf, strlen(SendBuf));
        if (SendLen > 0) {
            counter += SendLen;
            printf("send counter: %lu SendLen: %d\n", counter, SendLen);
        } else {
            printf("Error: send failed.\n");
        }
        sleep(1);
    }
    return NULL;
}

创建接收线程函数

// 接收数据线程
void *recv_data(void *arg) {
    char RecvBuf[1200];
    int RecvLen;
    unsigned long counter = 0;
    portinfo_t *pportinfo = (portinfo_t *)arg;

    while (running) {
        memset(RecvBuf, 0, sizeof(RecvBuf));
        RecvLen = PortRecv(fdcom, RecvBuf, 500, pportinfo->baudrate);
        if (RecvLen > 0) {
            counter += RecvLen;
            printf("RCV: counter: %lu RecvLen: %d, %s\n", counter, RecvLen, RecvBuf);
        } else {
            printf("Recv error!\n");
        }
        sleep(1);
    }
    return NULL;
}

串口发送函数

int PortSend(int fdcom, char *data, int datalen)
{
	int len = 0;
#ifdef U16C954
	int line =TIOCM_DTR;			//for 16954 chip,use DTR instead of RTS
#else
	int line =TIOCM_RTS;
#endif
	if(ioctl(fdcom,TIOCMBIS,&line))		// 1--send 0--receive
		printf("enter send mode error \n");
	usleep(10);
	
	len = write(fdcom, data, datalen);	//实际写入的长度
	#if 0
	if(len == datalen){
		return (len);
	}
	else{
		tcflush(fdcom, TCOFLUSH);
		return -1;
	}
	#endif
	if(len != datalen){
		tcflush(fdcom,TCOFLUSH);
	}
	return len;
}

串口接收函数

int PortRecv(int fdcom, char *data, int datalen, int baudrate)
{
	int readlen, fs_sel;
	fd_set	fs_read;
	struct timeval tv_timeout;
#ifdef U16C954
	int line = TIOCM_DTR;
#else
	int line = TIOCM_RTS;
#endif
	
	if (ioctl(fdcom,TIOCMBIC,&line))
		printf("enter receive mode error\n");
	usleep(10);

	FD_ZERO(&fs_read);
	FD_SET(fdcom, &fs_read);
	tv_timeout.tv_sec = TIMEOUT_SEC(datalen, baudrate);
	tv_timeout.tv_usec = TIMEOUT_USEC;

	fs_sel = select(fdcom+1, &fs_read, NULL, NULL, &tv_timeout);
	if(fs_sel){
		readlen = read(fdcom, data, datalen);
		return(readlen);
	}
	else{
		return(-1);
	}

	return (readlen);
}

主函数

int main(int argc, char *argv[]) {
pthread_t send_thread, recv_thread;


        pthread_create(&send_thread, NULL, send_data, NULL);
        pthread_create(&recv_thread, NULL, recv_data, (void *)&portinfo);

        // 等待线程结束
        pthread_join(send_thread, NULL);
        pthread_join(recv_thread, NULL);
}

注意:添加头文件

#include <pthread.h>

编译

gcc main.c -o main -lpthread

注意:

代码未全部给出,结合实际情况使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值