📄 com2_test.c
字号:
#include <stdio.h> /* printf */
#include <fcntl.h> /* open */
#include <string.h> /* bzero */
#include <stdlib.h> /* exit */
#include <sys/times.h> /* times */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <limits.h>
#include <termios.h>
#include <ctype.h>
#include <errno.h>
#define NO_ACK 0
#define ACK_1 1
#define ACK_3 2
#define TIMEOUT_SEC(buflen,baud) (buflen*20/baud+2)
#define TIMEOUT_USEC 0
static struct termios termios_old, termios_new;
static struct timeval tv_timeout;
static fd_set fs_read, fs_write;
//COM
static int BAUDRATE (int baudrate)
{
switch (baudrate) {
case 0:
return (B0);
case 50:
return (B50);
case 75:
return (B75);
case 110:
return (B110);
case 134:
return (B134);
case 150:
return (B150);
case 200:
return (B200);
case 300:
return (B300);
case 600:
return (B600);
case 1200:
return (B1200);
case 2400:
return (B2400);
case 9600:
return (B9600);
case 19200:
return (B19200);
case 38400:
return (B38400);
case 57600:
return (B57600);
case 115200:
return (B115200);
default:
return (B9600);
}
}
static int _BAUDRATE (int baudrate)
{
/* reverse baudrate */
switch (baudrate) {
case B0:
return (0);
case B50:
return (50);
case B75:
return (75);
case B110:
return (110);
case B134:
return (134);
case B150:
return (150);
case B200:
return (200);
case B300:
return (300);
case B600:
return (600);
case B1200:
return (1200);
case B2400:
return (2400);
case B9600:
return (9600);
case B19200:
return (19200);
case B38400:
return (38400);
case B57600:
return (57600);
case B115200:
return (115200);
default:
return (9600);
}
}
static void SetDataBit (int databit)
{
termios_new.c_cflag &= ~CSIZE;
switch (databit) {
case 8:
termios_new.c_cflag |= CS8;
break;
case 7:
termios_new.c_cflag |= CS7;
break;
case 6:
termios_new.c_cflag |= CS6;
break;
case 5:
termios_new.c_cflag |= CS5;
break;
default:
termios_new.c_cflag |= CS8;
break;
}
}
static void SetStopBit (const char *stopbit)
{
if (0 == strcmp (stopbit, "1")) {
termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
}
else if (0 == strcmp (stopbit, "1.5")) {
termios_new.c_cflag &= ~CSTOPB; /* 1.5 stop bits */
}
else if (0 == strcmp (stopbit, "2")) {
termios_new.c_cflag |= CSTOPB; /* 2 stop bits */
}
else {
termios_new.c_cflag &= ~CSTOPB; /* 1 stop bit */
}
}
static void SetParityCheck (char parity)
{
switch (parity) {
case 'N': /* no parity check */
termios_new.c_cflag &= ~PARENB;
break;
case 'E': /* even */
termios_new.c_cflag |= PARENB;
termios_new.c_cflag &= ~PARODD;
break;
case 'O': /* odd */
termios_new.c_cflag |= PARENB;
termios_new.c_cflag |= ~PARODD;
break;
default: /* no parity check */
termios_new.c_cflag &= ~PARENB;
break;
}
}
static int SetPortAttr (int fd,int baudrate,int databit, const char *stopbit, char parity)
{
bzero (&termios_new, sizeof (termios_new));
cfmakeraw (&termios_new);
termios_new.c_cflag = BAUDRATE (baudrate); /* set baudrate */
termios_new.c_cflag |= CLOCAL | CREAD; /* | CRTSCTS */
SetDataBit (databit);
SetParityCheck (parity);
SetStopBit (stopbit);
termios_new.c_oflag = 0;
termios_new.c_lflag |= 0;
termios_new.c_oflag &= ~OPOST;
termios_new.c_cc[VTIME] = 1; /* unit: 1/10 second. */
termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */
tcflush (fd, TCIFLUSH);
return (tcsetattr (fd, TCSANOW, &termios_new));
}
/* Open serial port ComPort at baudrate baud rate. */
int OpenComPort (int ComPort, int baudrate, int databit,
const char *stopbit, char parity)
{
char *pComPort;
int retval;
int fd;
struct termios termios_old;
switch (ComPort) {
case 0:
pComPort = "/dev/ttymxc/0";
break;
case 1:
pComPort = "/dev/ttymxc/1";
break;
case 2:
pComPort = "/dev/ttymxc/2";
break;
case 3:
pComPort = "/dev/ttymxc/3";
break;
default:
pComPort = "/dev/ttymxc/0";
break;
}
fd = open (pComPort, O_RDWR);
if (fd == -1)
{
fprintf (stderr, "cannot open port %s\n", pComPort);
return (-1);
}
tcgetattr (fd, &termios_old); /* save old termios value */
retval = SetPortAttr (fd,baudrate,databit, stopbit, parity);
if (retval == -1)
{
fprintf (stderr, "\nport %s cannot set baudrate at %d\n", pComPort,
baudrate);
return -1;
}
return fd;
}
void CloseComPort (int fd)
{
/* flush output data before close and restore old attribute */
tcsetattr (fd, TCSADRAIN, &termios_old);
close (fd);
}
static int GetBaudrate ()
{
return (_BAUDRATE (cfgetospeed (&termios_new)));
}
int WriteComPort (int fd, char * data, int datalength)
{
int retval, len = 0, total_len = 0;
int i;
#if 0
printf("write: ");
for(i=0;i<datalength; i++)
printf("0x%02x ",data[i]);
printf("\r\n");
#endif
FD_ZERO (&fs_write);
FD_SET (fd, &fs_write);
tv_timeout.tv_sec = TIMEOUT_SEC (datalength, GetBaudrate ());
tv_timeout.tv_usec = TIMEOUT_USEC;
for (total_len = 0, len = 0; total_len < datalength;)
{
retval = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout);
if (retval)
{
len = write (fd, &data[total_len], datalength - total_len);
if (len > 0) {
total_len += len;
}
}
else if(retval == 0)
{
printf("WriteComPort timeout \n");
break ;
}
else {
tcflush (fd, TCOFLUSH); /* flush all output data */
break;
}
}
usleep(1000);
return (total_len);
}
#if 1
int ReadComPort (int fd, void *data, int datalength, int option)
{
int retval = 0;
int len = 0;
FD_ZERO (&fs_read);
FD_SET (fd, &fs_read);
switch(option)
{
case NO_ACK:
retval = select (fd + 1, &fs_read, NULL, NULL, NULL);
break;
case ACK_1:
tv_timeout.tv_sec = 0.1;
tv_timeout.tv_usec = 0;
retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
break;
case ACK_3:
tv_timeout.tv_sec = 0.3;
tv_timeout.tv_usec = 0;
retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
break;
default:
retval = select (fd + 1, &fs_read, NULL, NULL, NULL);
break;
}
if (retval)
{
len = read (fd, data, datalength);
printf("ReadComPort len=%d \n",len);
return len;
}
else if(retval == 0)
{ printf("ReadComPort timeout \n"); return 0; } else { printf("selct() call failed : %s \n",strerror(errno)); return -1; }
}
#endif
//end COM
int checksum(char * strbuf ,int len)
{
int i, temp = 0;
for(i=0; i<len; i++)
temp += strbuf[i];
return temp;
}
int main(int argc, char **argv)
{
int i;
unsigned char redbuf[30];
static int fd;
int ret = 0;
int len = 8;
/* open comport */
fd = OpenComPort(2, 115200, 8, "1",'N');
if(fd < 0)
{
printf("Can not open the serial port\n");
return -1;
}
memset(redbuf, 0, sizeof(redbuf));
ret = ReadComPort(fd, redbuf, len,NO_ACK);
if(ret < 0)
{
printf("ReadComPort failed \n");
return 0;
}
else
{
for( i=0; i<len; i++)
printf("0x%02x ",redbuf[i]);
printf("\r\n");
WriteComPort (fd, redbuf, len);
}
close(fd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -