
先声明,没调试过。。仅供参考,有错误的地方请指正,谢谢!
////////////////////////
/******setport.h*******/
////////////////////////
#ifndef SETPORT_H
#define SETPORT_H
/*********************
int dwBaudRate //波特率
char bTTY //串口号
char bDataBit //数据位5,6,7,8
char bParity //奇偶校验 无校验:'N' 偶校验'E' 奇校验'O'
char bStopBit //停止位1,2
char bFctl //流控制无控制:'N' 硬件控制:'H'软件控制:'S'
**********************/
//-------------------打开串口-------------------//bTTY==0,1,2,3, 对应串口Com1到Com4,成功返回文件描述符,失败==(-1)
extern int PortOpen(char bTTY)
//-------------------设置串口-------------------//成功==(0) 失败==(-1)
extern int PortSet(int dwFdcom,int dwBaudRate,char bTTY,char bDataBit,char bParity,char bStopBit,char bFctl)
//-------------------关闭串口-------------------//
extern void PortClose(int dwFdcom)
//-------------------写串口-------------------//成功返回datalen 失败==(<0)
extern int PortWrite(int dwFdcom,char *cpSendBuf,unsigned int DataLen)
//-------------------读串口-------------------//成功返回datalen 失败==(-1)
extern int PortRead(int dwFdcom,char *cpRecvBuf,unsigned int DataLen,unsigned int dwBaudRate)
//-------------------超时设置-------------------//成功==0失败==(<0)
extern int PortTimeOut(int dwFdcom, char timeout, int len)
#endif
/////////////////////////////
/***********setport.c*******/
////////////////////////////
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <termios.h>
#include <sys/times.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include "setport.h"
//-------------------打开串口-------------------//
extern int PortOpen(char bTTY)
{
int dwFdcom
unsigned char Ptty[10]="/dev/ttyS"
unsigned char *cpGtty
cpGtty=strcat(Ptty,&bTTY)
if(!cpGtty) return -1
else {
dwFdcom=open(cpGtty,O_RDWR|O_NOCTTY)
}
return (dwFdcom)
}
//-------------------关闭串口-------------------//
extern void PortClose(int dwFdcom)
{
close(dwFdcom)
}
//-------------------设置串口-------------------//
extern int PortSet(int dwFdcom,int dwBaudRate,char bTTY,char bDataBit,char bParity,char bStopBit,char bFctl)
{
static int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300}
static int name_arr[] = {38400, 19200, 9600, 4800, 2400,1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300}
struct termios oldtm_t,newtm_t
int i=0char *pDatabit
bzero(&oldtm_t,sizeof(oldtm_t))
bzero(&newtm_t,sizeof(newtm_t))
cfmakeraw(&newtm_t)
tcgetattr(dwFdcom,&oldtm_t)
/*------------设置端口属性------------*/
for( i<sizeof(speed_arr)/sizeof(int) i++)
{
if(dwBaudRate==name_arr[i])
{
cfsetispeed(&newtm_t,speed_arr[i])
cfsetospeed(&newtm_t,speed_arr[i])
}
else return -1
}
newtm_t.c_cflag|=CLOCAL
newtm_t.c_cflag|=CREAD
newtm_t.c_cflag &= ~CSIZE
switch(bDataBit) //数据位
{
case '5':
newtm_t.c_cflag|=CS5
break
case '6':
newtm_t.c_cflag|=CS6
break
case '7':
newtm_t.c_cflag|=CS7
break
case '8':
newtm_t.c_cflag|=CS8
break
default:
return -2
}
switch(bParity)
{
case 'N':{ //无校验
newtm_t.c_cflag&=~PARENB
newtm_t.c_iflag&= ~INPCK
}break
case 'O':{ //奇校验
newtm_t.c_cflag |= (PARODD | PARENB)
newtm_t.c_iflag |= INPCK
}break
case 'E':{ //偶校验
newtm_t.c_cflag |= PARENB
newtm_t.c_cflag &= ~PARODD
newtm_t.c_iflag |= INPCK
}break
default:
return -3
}
//停止位
if(bStopBit=='2') newtm_t.c_cflag|=CSTOPB //2
else newtm_t.c_cflag&=~CSTOPB //1
switch(bFctl) //流控制
{
case 'N':{ //无控制
newtm_t.c_cflag &= ~CRTSCTS
newtm_t.c_iflag &= ~(IXON | IXOFF | IXANY )
}break
case 'H':{ //硬件控制
newtm_t.c_cflag |= CRTSCTS
newtm_t.c_iflag &= ~(IXON | IXOFF | IXANY )
}break
case 'S':{ //软件控制
newtm_t.c_cflag &= ~CRTSCTS
newtm_t.c_iflag |= (IXON | IXOFF | IXANY )
}break
default:
return -4
}
tcflush(dwFdcom,TCIFLUSH)//端口复位
tcsetattr(dwFdcom,TCSANOW,&newtm_t) //使端口属性设置生效
return 0
}
//-------------------超时设置-------------------//
extern int PortTimeOut(int dwFdcom, char timeout, int len)
{
struct termios newtm_t
if(tcgetattr(dwFdcom, &newtm_t) != 0)
{
return (-1)
}
newtm_t.c_lflag &= ~ICANON
newtm_t.c_cc[VTIME] = timeout
newtm_t.c_cc[VMIN] = len
if(tcsetattr(dwFdcom, TCSANOW, &newtm_t) != 0)
{
return (-2)
}
return 0
}
////读写串口用文件读写方式,read和write两个方法,
////read是接收数据,write是发送数据
这有个友善的串口例程,参考下吧,用gcc编译可以在linux下用# include <stdio.h>
# include <stdlib.h>
# include <termio.h>
# include <unistd.h>
# include <fcntl.h>
# include <getopt.h>
# include <time.h>
# include <errno.h>
# include <string.h>
int CommFd, TtyFd
static void Error(const char *Msg)
{
fprintf (stderr, "%s\n", Msg)
fprintf (stderr, "strerror() is %s\n", strerror(errno))
exit(1)
}
static void Warning(const char *Msg)
{
fprintf (stderr, "Warning: %s\n", Msg)
}
static int SerialSpeed(const char *SpeedString)
{
int SpeedNumber = atoi(SpeedString)
# define TestSpeed(Speed) if (SpeedNumber == Speed) return B##Speed
TestSpeed(1200)
TestSpeed(2400)
TestSpeed(4800)
TestSpeed(9600)
TestSpeed(19200)
TestSpeed(38400)
TestSpeed(57600)
TestSpeed(115200)
TestSpeed(230400)
Error("Bad speed")
return -1
}
static void PrintUsage(void)
{
fprintf(stderr, "comtest - interactive program of comm port\n")
fprintf(stderr, "press [ESC] 3 times to quit\n\n")
fprintf(stderr, "Usage: comtest [-d device] [-t tty] [-s speed] [-7] [-c] [-x] [-o] [-h]\n")
fprintf(stderr, " -7 7 bit\n")
fprintf(stderr, " -x hex mode\n")
fprintf(stderr, " -o output to stdout too\n")
fprintf(stderr, " -c stdout output use color\n")
fprintf(stderr, " -h print this help\n")
exit(-1)
}
static inline void WaitFdWriteable(int Fd)
{
fd_set WriteSetFD
FD_ZERO(&WriteSetFD)
FD_SET(Fd, &WriteSetFD)
if (select(Fd + 1, NULL, &WriteSetFD, NULL, NULL) <0) {
Error(strerror(errno))
}
}
int sendUart(char c)
{
WaitFdWriteable(CommFd)
return write(CommFd, &c, 1)
}
char recUart()
{
char c='\0'
if (FD_ISSET(CommFd, &ReadSetFD))
{
if(read(CommFd, &c, 1) == 1) return c
else printf("No data to receive.\n")
}
}
int main(int argc, char **argv)
{
struct termios TtyAttr
struct termios BackupTtyAttr
int DeviceSpeed = B115200
int TtySpeed = B115200
int ByteBits = CS8
const char *DeviceName = "/dev/ttyS0"
const char *TtyName = "/dev/tty"
int OutputHex = 0
int OutputToStdout = 0
int UseColor = 0
printf("Now we start.\n")
opterr = 0
for () {
int c = getopt(argc, argv, "d:s:t:7xoch")
if (c == -1)
break
switch(c) {
case 'd':
DeviceName = optarg
break
case 't':
TtyName = optarg
break
case 's':
if (optarg[0] == 'd') {
DeviceSpeed = SerialSpeed(optarg + 1)
} else if (optarg[0] == 't') {
TtySpeed = SerialSpeed(optarg + 1)
} else
TtySpeed = DeviceSpeed = SerialSpeed(optarg)
break
case 'o':
OutputToStdout = 1
break
case '7':
ByteBits = CS7
break
case 'x':
OutputHex = 1
break
case 'c':
UseColor = 1
break
case '?':
case 'h':
default:
PrintUsage()
}
}
if (optind != argc)
PrintUsage()
CommFd = open(DeviceName, O_RDWR, 0)
if (CommFd <0)
Error("Unable to open device")
if (fcntl(CommFd, F_SETFL, O_NONBLOCK) <0)
Error("Unable set to NONBLOCK mode")
memset(&TtyAttr, 0, sizeof(struct termios))
TtyAttr.c_iflag = IGNPAR
TtyAttr.c_cflag = DeviceSpeed | HUPCL | ByteBits | CREAD | CLOCAL
TtyAttr.c_cc[VMIN] = 1
if (tcsetattr(CommFd, TCSANOW, &TtyAttr) <0)
Warning("Unable to set comm port")
TtyFd = open(TtyName, O_RDWR | O_NDELAY, 0)
if (TtyFd <0)
Error("Unable to open tty")
TtyAttr.c_cflag = TtySpeed | HUPCL | ByteBits | CREAD | CLOCAL
if (tcgetattr(TtyFd, &BackupTtyAttr) <0)
Error("Unable to get tty")
if (tcsetattr(TtyFd, TCSANOW, &TtyAttr) <0)
Error("Unable to set tty")
for () {
unsigned char Char = 0
fd_set ReadSetFD
void OutputStdChar(FILE *File) {
char Buffer[10]
int Len = sprintf(Buffer, OutputHex ? "%.2X " : "%c", Char)
fwrite(Buffer, 1, Len, File)
}
FD_ZERO(&ReadSetFD)
FD_SET(CommFd, &ReadSetFD)
FD_SET( TtyFd, &ReadSetFD)
# define max(x,y) ( ((x) >= (y)) ? (x) : (y) )
if (select(max(CommFd, TtyFd) + 1, &ReadSetFD, NULL, NULL, NULL) <0) {
Error(strerror(errno))
}
# undef max
if (FD_ISSET(CommFd, &ReadSetFD)) {
while (read(CommFd, &Char, 1) == 1) {
WaitFdWriteable(TtyFd)
if (write(TtyFd, &Char, 1) <0) {
Error(strerror(errno))
}
if (OutputToStdout) {
if (UseColor)
fwrite("\x1b[0134m", 1, 8, stdout)
OutputStdChar(stdout)
if (UseColor)
fwrite("\x1b[00m", 1, 8, stdout)
fflush(stdout)
}
}
}
if (FD_ISSET(TtyFd, &ReadSetFD)) {
while (read(TtyFd, &Char, 1) == 1) {
static int EscKeyCount = 0
WaitFdWriteable(CommFd)
if (write(CommFd, &Char, 1) <0) {
Error(strerror(errno))
}
if (OutputToStdout) {
if (UseColor)
fwrite("\x1b[0131m", 1, 8, stderr)
OutputStdChar(stderr)
if (UseColor)
fwrite("\x1b[00m", 1, 8, stderr)
fflush(stderr)
}
if (Char == '\x1b') {
EscKeyCount ++
if (EscKeyCount >= 3)
goto ExitLabel
} else
EscKeyCount = 0
}
}
}
ExitLabel:
if (tcsetattr(TtyFd, TCSANOW, &BackupTtyAttr) <0)
Error("Unable to set tty")
return 0
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)