6410串口编程初步
来源:互联网 发布:网络彩票骗局揭秘 编辑:程序博客网 时间:2024/06/05 01:19
基于飞凌ok6410
串口调试工具3.0,两根usb转串口,一根用于终端调试,一根接串口扩展的com1,com1接pc实现串口助手
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
/*鎵撳紑涓插彛鍑芥暟*/
int open_port(int fd,int comport)
{
char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};
long vdisable;
if (comport==1)//涓插彛 1
{
fd = open( "/dev/ttySAC0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port0");
return(-1);
}
}
else if(comport==2)//涓插彛 2
{
fd = open( "/dev/ttySAC1", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port1");
return(-1);
}
}
else if (comport==3)//涓插彛 3
{
fd = open( "/dev/ttySAC2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
perror("Can't Open Serial Port2");
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 set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
/*淇濆瓨娴嬭瘯鐜版湁涓插彛鍙傛暟璁剧疆,鍦ㄨ繖閲屽鏋滀覆鍙e彿绛夊嚭閿?浼氭湁鐩稿叧鐨勫嚭閿欎俊鎭?/
if ( tcgetattr( fd,&oldtio) != 0)
{
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
/*姝ラ涓€,璁剧疆瀛楃澶у皬*/
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE;
/*璁剧疆鍋滄浣?/
switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
/*璁剧疆濂囧伓鏍¢獙浣?/
switch( nEvent )
{
case 'O': //濂囨暟
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E': //鍋舵暟
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N': //鏃犲鍋舵牎楠屼綅
newtio.c_cflag &= ~PARENB;
break;
}
/*璁剧疆娉㈢壒鐜?/
switch( nSpeed )
{
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] = 0;
newtio.c_cc[VMIN] = 0;
/*澶勭悊鏈帴鏀跺瓧绗?/
tcflush(fd,TCIFLUSH);
/*婵€娲绘柊閰嶇疆*/
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
perror("com set error");
return -1;
}
printf("set done!\n");
return 0;
}
int main(void)
{
int fd;
int nwrite,i,nread;
//char buff[]="Hello\n";
if((fd=open_port(fd,2))<0)
{
//鎵撳紑涓插彛
perror("open_port error");
return;
}
if((i=set_opt(fd,115200,8,'N',1))<0)
{//璁剧疆涓插彛
perror("set_opt error");
return;
}
printf("fd=%d\n",fd);
for(i=0; i<100; i++)
{
char buff[]="11\n";
printf("nread=%d,%s\n",nread,buff);
printf("--------This is yuanlai de buff---------\n");
nwrite=write(fd,buff,sizeof(buff));//鍐欎覆鍙?
nread=read(fd,buff,1024);
//printf("nwrite=%d,%s\n",nwrite,buff);
printf("nread=%d,%s\n",nread,buff);
printf("--------THIS IS CHANGED DUFF-----\n");
sleep(1);
}
close(fd);
return;
}
----------------------------------------------
下面是 友善的 GPRS + 串口 程序。。当做笔记了。。哈哈
----------------------------------------------------
这有个友善的串口例程,参考下吧,用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[01;34m", 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[01;31m", 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;}
- 6410串口编程初步
- windows下串口初步编程(多线程+windows串口)
- 串口操作使用初步
- 串口的 初步设置
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- 串口编程
- UDP 协议
- linux总结——Linux档案属性与目录配置
- 准备再推出汉澳sinox2012,不过这次不标价
- 链路汇聚
- C++内存对象大会战1
- 6410串口编程初步
- /lib和/usr/lib、/usr/local/lib区别
- C++内存对象大会战2
- 浅析linux开发工具adb具体实现
- C#实现读写app.config中的connectionStrings
- startx时出现这样的提示:FreeFontPoth: FPE "/usr/share/fonts/misc:unscaled"
- Linux网络编程一步一步学-HTTPS客户端程序示例
- c# 消息机制
- Android的存储神器:SharedPreferences