#include "mycom.h"
#define REVBUFFLEN 100
#define SENDBUFFLEN 100
static int com_fd;
static pthread_t timethread_id,revthread_id;
static char sendbuff[SENDBUFFLEN];
static char revbuff[REVBUFFLEN];
static Set_cfg_info send_info;
/***@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void*/
int main(int argc, char **argv)
{
memset(sendbuff,0,SENDBUFFLEN);
memset(revbuff,0,SENDBUFFLEN);
memcpy(sendbuff,"hello",5);
initsendinfo();
Createpthread();//创建两个线程,一个用于定时,一个用于接收数据;
initcom(100,115200,8,1,'n'); //初始化串口,100代表usb转串口;
revthread();
pthread_join(timethread_id,NULL);
}
void Createpthread()
{
int ret;
ret=pthread_create(&timethread_id,NULL,(void *) timethread,NULL);
if(ret!=0){
printf ("Create timepthread error!\n");
exit (1);
}
//else
// printf ("Create timethread ok!\n");
ret=pthread_create(&revthread_id,NULL,(void *) revthread,NULL);
if(ret!=0){
printf ("Create revthread_id error!\n");
exit (1);
}
// else
// printf ("pthread2 ok!\n");
}
void timethread()
{
struct itimerval value;
long nowsec,nowusec;
// if(signal(SIGUSR1,SendDate)==SIG_ERR)
// {
// printf("Unable to create handler for SIGUSR1\n");
// exit(0);
// }
if(signal(SIGALRM,SendDate)==SIG_ERR)
{
printf("Unable to create handler for SIGSIGALRM\n");
exit(0);
}
value.it_value.tv_sec=0; /* 定时500ms */
value.it_value.tv_usec=500000;
value.it_interval.tv_sec=0; /* 定时500ms */
value.it_interval.tv_usec=500000;
// signal(SIGALRM, SendDate); /* 捕获定时信号 */
setitimer(ITIMER_REAL, &value, NULL); /* 设置定时器*/
// while(1)
// {
// getitimer(ITIMER_REAL,&value);
// nowsec=value.it_value.tv_sec;
// nowusec=value.it_value.tv_usec;
// if(nowusec==490000)
// {
// raise(SIGUSR1);
// }
// }
}
void revthread()
{
int nrev=0;
while(1)
{
nrev = read(com_fd,revbuff,512);
if(nrev>0)
{
printf("\nLen %d\n",nrev);
revbuff[nrev+1]='\0';
printf("\n%s",revbuff);
//sleep(1);
}
}
}
void SendDate(int sig)
{
int nsend=0;
switch(sig)
{
case SIGALRM:
// case SIGUSR1:
{ if((nsend=write(com_fd,&send_info,8))>0)
{
printf("\nLen %d\n",nsend);
printf("%x\n",send_info.Len);
}
}
break;
default:
break;
}
}
void initcom(int comnum,int boad,int datelen, int stoplen,int parity)
{
char *dev;
switch(comnum)
{
case 1:
dev="/dev/ttyS0";
break;
case 2:
dev="/dev/ttyS1";
break;
case 3:
dev="/dev/ttyS2";
break;
case 4:
dev="/dev/ttyS3";
break;
case 5:
dev="/dev/ttyS4";
break;
case 100:
dev ="/dev/ttyUSB0";
break;
default:
break;
}
com_fd = OpenDev(dev);
if (com_fd>0)
set_speed(com_fd,boad);
else
{
printf("Can't Open Serial Port!\n");
exit(0);
}
if (set_Parity(com_fd,datelen,stoplen,parity)== FALSE)
{
printf("Set Parity Error\n");
exit(1);
}
}
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄*
*@param databits 类型 int 数据位 取值 为 7 或者8*
*@param stopbits 类型 int 停止位 取值为 1 或者2*
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n");
return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
options.c_cc[VTIME] = 150; // 15 seconds
options.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}
/**
*@breif 打开串口
*/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if (-1 == fd)
{ /*设置数据位数*/
perror("Can't Open Serial Port");
return -1;
}
if(fcntl(fd, F_SETFL, 0)<0)
printf("fcntl failed!\n");
else
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
//else
return fd;
}
void initsendinfo()
{
send_info.type=0x01;
send_info.Len=0x04;
send_info.datalen=0x05;
send_info.rev[0]=0x06;
send_info.rev[1]=0x09;
send_info.Width=0x07;
send_info.Jiaoyan=0x08;
}
- 1
- 2
前往页