创建发送线程函数
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
注意:
代码未全部给出,结合实际情况使用。