📄 comport.c
字号:
/*********************************************************
版权所有:银骏科技
版本号 :1.00
文件名 :Slave.c
创建日期:07/03
创建者:
功能说明: 串口处理程序文件
*********************************************************/
#define ARM_COMPORT_GLOBALS
#include "cfg_ISlave.h"
struct termios newtio,oldtio;
int GetComDevName (INT8U ttyDevSn, char *cDevName,int nMaxLen);
/*****************************************************************************************
函数名称: int SetComOpt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
功能说明: 设置串口的参数
输入参数:
输出参数:
其它说明: nSpeed 波特率,nBits数据位,nEvent校验位('N'(无校验),'O'(奇校验),'E'(偶校验),nStop 1-2停止位
******************************************************************************************/
int SetComOpt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{
bzero( &newtio, sizeof( newtio ) );
cfmakeraw(&newtio);
tcflush(fd,TCIFLUSH);
newtio.c_cflag &= ~CRTSCTS; // no stream ctrl
newtio.c_cflag |= CLOCAL | CREAD; /* | CRTSCTS //stream strl*/
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
switch( nEvent )
{
case 'o':
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
// newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'e' :
case 'E':
//newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'n':
case 'N':
newtio.c_cflag &= ~PARENB;
break;
}
switch( nSpeed )
{
case 1200:
cfsetispeed(&newtio, B1200);
cfsetospeed(&newtio, B1200);
break;
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 )
newtio.c_cflag &= ~CSTOPB;
else if ( nStop == 2 )
newtio.c_cflag |= CSTOPB;
newtio.c_cc[VTIME] = 1;
newtio.c_cc[VMIN] = 1;
newtio.c_oflag = 0;
newtio.c_lflag |= 0;
newtio.c_oflag &= ~OPOST;
newtio.c_cc[VTIME] = 1; /* unit: 1/10 second. */
newtio.c_cc[VMIN] = 1; /* minimal characters for reading */
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
//printf("set done!\n");
return 0;
}
/*****************************************************************************************
函数名称: int OpenCom(INT8U comPort)
功能说明: 打开指定串口返回一个句柄
输入参数:
输出参数:
其它说明: comport是从0开始的
******************************************************************************************/
int OpenCom(INT8U comPort)
{
char cComPort[20] = { 0 };
int fd;
if (SUCCESS == GetComDevName (comPort, (char *) cComPort,20))
{
fd = open (cComPort, O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd > 0)
{
tcgetattr(fd,&oldtio);
}
}
else
{
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);
return fd;
}
/*****************************************************************************************
函数名称: int GetComDevName (INT8U ttyDevSn, char *cDevName,int nMaxLen)
功能说明:获取串口的驱动名称 0-2为ttyS 三星公司自带的 3-n 为扩展串口驱动名称为ttyYJ
输入参数:
输出参数:
其它说明:
******************************************************************************************/
int GetComDevName (INT8U ttyDevSn, char *cDevName,int nMaxLen)
{
int nRet = -1,nSn;
if(nMaxLen < 15) return -1;
memset(cDevName,0,nMaxLen);
if(ttyDevSn < 3)
{
nSn = ttyDevSn;
strcpy (cDevName, "/dev/ttyS");
}
else
{
strcpy (cDevName, "/dev/ttyYJ");
nSn = ttyDevSn-3;
}
if (ttyDevSn <= MAXCOMNO)
{
nRet = strlen (cDevName);
sprintf(&cDevName[nRet],"%d",nSn);
nRet = SUCCESS;
}
return nRet;
}
/*****************************************************************************************
函数名称: int ComSend (int fd,const INT8U * cSendBuf, INT32U nSendLen, INT32U nWaitmScnd)
功能说明:串口发送数据 返回实际发送的字节数
输入参数:
输出参数:
其它说明: fd 为打开时的句柄 nWaitmScnd 为等待的时间毫秒级
******************************************************************************************/
int ComSend (int fd,const INT8U * cSendBuf, INT32U nSendLen, INT32U nWaitmScnd)
{
struct timeval tv_timeout;
int nCurLen, len ;
INT32U dwSent ;
fd_set fs_write;
len = 0;
dwSent = 0;
FD_ZERO (&fs_write);
FD_SET (fd, &fs_write);
tv_timeout.tv_sec = 0; //TIMEOUT_SEC (nSendLen, GetBaudrate (&oldtio));
tv_timeout.tv_usec = nWaitmScnd*1000;//TIMEOUT_USEC;
while (dwSent < nSendLen) {
nCurLen = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout);
if (nCurLen > 0)
{
nCurLen = nSendLen - dwSent - 10;
if (nCurLen > 0)
nCurLen = 10;
else
nCurLen = nSendLen - dwSent;
len = write (fd, &cSendBuf[dwSent], nCurLen);
if (len > 0) {
dwSent += len;
}
}
else
{
tcflush (fd, TCOFLUSH); /* flush all output data */
break;
}
usleep(1);
}
return dwSent;
}
/*****************************************************************************************
函数名称:int ComRecv (int fd,INT8U * cRecvBuf, INT32U nReqBytes, INT32U nWaitmScnd)
功能说明:串口接收数据 返回实际接收的字节数
输入参数:
输出参数:
其它说明: fd 为打开时的句柄 nWaitmScnd 为等待的时间毫秒级
******************************************************************************************/
int ComRecv (int fd,INT8U * cRecvBuf, INT32U nReqBytes, INT32U nWaitmScnd)
{
int retval ;
static fd_set fs_read;
struct timeval tv_timeout;
int nTot=0,nTry=0;
// int nread;
retval = FAILED;
FD_ZERO (&fs_read);
FD_SET (fd, &fs_read);
tv_timeout.tv_sec = 0;//TIMEOUT_SEC (nReqBytes, GetBaudrate ());
tv_timeout.tv_usec = nWaitmScnd*1000;//TIMEOUT_USEC;
nReqBytes = (nReqBytes == 0 ? retval : nReqBytes);
retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
if (retval > 0)
{
do
{
do{
retval = read (fd, &cRecvBuf[nTot++],1);
}while( (retval>0) && (nTot < nReqBytes) );
if(retval < 0) nTot--;// failed,move point back
if( ((retval>0)&&(nTot==nReqBytes)) || (nTry > 150) )
{
retval = nTot;
break;
}
else
{
usleep(1);
nTry++;
}
}while(1);
}
return retval;
}
/*****************************************************************************************
函数名称: int CloseCom (int fd)
功能说明:关闭串口
输入参数:
输出参数:
其它说明: fd 为打开时的句柄
******************************************************************************************/
int CloseCom (int fd)
{
tcsetattr (fd, TCSANOW, &oldtio); // restore old
tcflush (fd, TCOFLUSH);
return close (fd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -