📄 com_client.c
字号:
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/times.h>
#include <sys/types.h>
#include <termios.h>
#include <unistd.h>
#include <sys/ioctl.h>
//
#include <pthread.h>
#include <semaphore.h>
//
#include <sys/stat.h> /**/
#include <errno.h> /*错误号定义*/
//////////////////////////////////////////////////////////////////////////
typedef struct {
char prompt;
int baudrate;
char databit;
char debug;
char echo;
char fctl;
char tty;
char parity;
char stopbit;
const int reserved;
}portinfo_t;
typedef portinfo_t *pportinfo_t;
//////////////////////////////////////////////////////////////////////////
#define TTY_DEV "/dev/ttyS"
#define TIMEOUT_SEC(buflen,baud)(buflen*20/baud+2)
#define TIMEOUT_USEC 0
//////////////////////////////////////////////////////////////////////////
sem_t bin_sem;
//////////////////////////////////////////////////////////////////////////
char *get_ptty(pportinfo_t pportinfo)
{
char *ptty;
switch(pportinfo->tty)
{
case '0':
ptty=TTY_DEV"0";
break;
case '1':
ptty=TTY_DEV"1";
break;
case '2':
ptty=TTY_DEV"2";
break;
default:
ptty=TTY_DEV"0";
}
return(ptty);
}
//////////////////////////////////////////////////////////////////////////
int convbaud(unsigned long baudrate)
{
switch(baudrate)
{
case 2400:
return B2400;
case 4800:
return B4800;
case 9600:
return B9600;
case 38400:
return B38400;
case 57600:
return B57600;
case 115200:
return B115200;
default:
return B115200;
}
}
//////////////////////////////////////////////////////////////////////////
int PortSet(int fdcom, const pportinfo_t pportinfo)
{
struct termios termios_old, termios_new;
int baudrate, tmp;
char databit,stopbit,parity,fctl;
bzero(&termios_old,sizeof(termios_old));
bzero(&termios_new,sizeof(termios_new));
cfmakeraw(&termios_new);
tcgetattr(fdcom,&termios_old);
//baudrate
baudrate=convbaud(pportinfo->baudrate);
cfsetispeed(&termios_new,baudrate);
cfsetospeed(&termios_new,baudrate);
termios_new.c_cflag |=CLOCAL;
termios_new.c_cflag |=CREAD;
//
fctl=pportinfo->fctl;
switch(fctl) {
case '0':
termios_new.c_cflag &= ~CRTSCTS;
break;
case '1':
termios_new.c_cflag |= CRTSCTS;
break;
case '2':
termios_new.c_iflag |= IXON|IXOFF|IXANY;
break;
}
//
termios_new.c_cflag &= ~CSIZE;
databit=pportinfo->databit;
switch(databit)
{
case '5':
termios_new.c_cflag |=CS5;
break;
case '6':
termios_new.c_cflag |=CS6;
break;
case '7':
termios_new.c_cflag |=CS7;
break;
default:
termios_new.c_cflag |=CS8;
}
//
parity=pportinfo->parity;
switch(parity)
{
case '0':
termios_new.c_cflag &=~PARENB;
break;
case '1':
termios_new.c_cflag |=PARENB;
termios_new.c_cflag &=~PARODD;
break;
case '2':
termios_new.c_cflag |=PARENB;
termios_new.c_cflag |=~PARODD;
break;
default:
}
//
stopbit=pportinfo->stopbit;
if (stopbit=='2')
{
termios_new.c_cflag |=CSTOPB;
}
else
{
termios_new.c_cflag &=~CSTOPB;
}
//
termios_new.c_oflag &=~OPOST;
termios_new.c_cc[VMIN]=1;
termios_new.c_cc[VTIME]=1;
tcflush(fdcom,TCIFLUSH);
tmp=tcsetattr(fdcom,TCSANOW,&termios_new);
tcgetattr(fdcom,&termios_old);
return(tmp);
}
//////////////////////////////////////////////////////////////////////////
int PortOpen(pportinfo_t pportinfo)
{
int fdcom;
char *ptty;
ptty=get_ptty(pportinfo);
fdcom=open(ptty,O_RDWR|O_NOCTTY|O_NONBLOCK);
return(fdcom);
}
//////////////////////////////////////////////////////////////////////////
void PortClose(int fdcom)
{
close(fdcom);
}
//////////////////////////////////////////////////////////////////////////
int PortSend(int fdcom, char *data, int datalen)
{
int len=0;
len=write(fdcom,data,datalen);
if (len==datalen)
{
return(len);
}
else
{
tcflush(fdcom,TCOFLUSH);
return -1;
}
}
//////////////////////////////////////////////////////////////////////////
int PortRecv(int fdcom,char *data, int datalen,int baudrate)
{
int readlen,fs_sel;
fd_set fs_read;
struct timeval tv_timeout;
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);
}
//////////////////////////////////////////////////////////////////////////
void *thread_function(void *arg)
{
sem_wait(&bin_sem);
printf("sssssssssssssssssss\n");
sem_wait(&bin_sem);
// while(strncmp("end", work_area, 3) != 0)
// {
// printf("You input %d characters\n", strlen(work_area) -1);
// sem_wait(&bin_sem);
// }
pthread_exit(NULL);
}
//////////////////////////////////////////////////////////////////////////
int main(int argc,char *argv[])
{
int fdcom,i,SendLen,RecvLen,res;
struct termios termios_cur;
char RecvBuf[10];
portinfo_t portinfo=
{
'0',//print prompt after receiving
115200,//baudrate 9600
'8',//databit 8
'0',//debug:off
'0',//echo:off
'2',//flow control:software
'1',//default ttyS0
'0',//parity
'1',//stopbit
0//reserved
};
//
if (argc !=2)
{
printf("usage:<type0-send1-recvice>\n");
printf(" eg:");
printf(" MyPort0");
exit(-1);
}
//
fdcom=PortOpen(&portinfo);
if (fdcom<0) {
printf("error open serial error!\n");
exit(1);
}
//
PortSet(fdcom,&portinfo);
if (atoi(argv[1])==0)
{
for(i=0;i<100;i++)
{
SendLen=PortSend(fdcom,"1234567",10);
if (SendLen>0)
{
printf("\n No %d send %d data 1234567.\n",i,SendLen);
}
else
{
printf("error:send failed\n");
}
sleep(1);
}
PortClose(fdcom);
}
else
{
for(;;)
{
RecvLen=PortRecv(fdcom,RecvBuf,10,portinfo.baudrate);
if(RecvLen>0)
{
for(i=0;i<RecvLen;i++)
{
printf("\n recevie data No %d is %x.\n",i,RecvBuf[i]);
}
printf("\n Total frame length is %d.\n",RecvLen);
//
sem_post(&bin_sem);
}
else
{
printf("error:receive error\n");
}
sleep(2);
}
}
//////////////////////////////////////////////////////////////////////////
res = sem_init(&bin_sem, 0, 0);
if (res != 0)
{
perror("Semaphore initialization failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if (res != 0)
{
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
printf("Input some text. Enter 'end' to finish\n");
//////////////////////////////////////////////////////////////////////////
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -