一个串口通信程序,适用于3g模块发送简单AT指令

源码如下:

#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 tty_fd;

int max(int a,int b)
{
    return a>b?a:b;
}

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio,oldtio;
    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;
        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 open_port(int fd,int comport)
{
    //    char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
    //    long  vdisable;
    if (comport==0)
    {
        //printf("open /dev/ttyUSB0");
        fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can‘t Open Serial Port");
            return(-1);
        }
        else
        {
        //  printf("open ttyUSB0 .....\n");
        }
    }
    else if(comport==1)
    {    fd = open( "/dev/ttyUSB1", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can‘t Open Serial Port");
            return(-1);
        }
        else
        {
        //  printf("open ttyUSB1 .....\n");
        }
    }
    else if (comport==2)
    {
        fd = open( "/dev/ttyUSB2", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can‘t Open Serial Port");
            return(-1);
        }
        else
        {
        //  printf("open ttyUSB2 .....\n");
        }
    }
    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 main(int argc, char *argv[])
{
    int maxfd;
    fd_set rd;
    int nread,i;
    char tmp_buff[8];
    char buff[1024];
    char send_buf[1024];
    int offset;
    char recvbuf[1024];

    struct timeval timeout={0,50000};
    int timeout_flg = 0;
    int recv_flg = 0;

    //  pthread_t check_ack_thread;
    //   pthread_attr_t check_ack_thread_attr;

    if((tty_fd=open_port(tty_fd,1))<0)
    {
        perror("open_port error");
        return 0;
    }
    if((i=set_opt(tty_fd,115200,8,‘N‘,1))<0)
    {
        perror("set_opt error");
        return 0;
    }
//  printf("fd=%d\n",tty_fd);

    FD_ZERO(&rd);

    strcpy(send_buf,argv[1]);
//  printf("uart >> ");
    send_buf[strlen(send_buf)] = ‘\r‘;
    send_buf[strlen(send_buf) + 1] = ‘\n‘;
    send_buf[strlen(send_buf) + 2] = 0;
    write(tty_fd, send_buf, strlen(send_buf));
    memset(send_buf,0,sizeof(send_buf));

    FD_SET(tty_fd, &rd);
    FD_SET(fileno(stdin), &rd);

    maxfd = max(fileno(stdin), tty_fd) + 1;

    if(select(maxfd, &rd, NULL,NULL,NULL) < 0)  {
        perror("select error\n");
    }
    if(FD_ISSET(tty_fd, &rd)){
        while((nread = read(tty_fd, buff, sizeof(buff))) > 0)
        {
            printf("%s", buff);
            memset(buff, 1 , sizeof(buff));
        }
        exit(1);
    }

    close (tty_fd);
    return 0;  

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-03 04:05:47

一个串口通信程序,适用于3g模块发送简单AT指令的相关文章

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

Qt编写串口通信程序全程图文解说

(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们能够去 http://sourceforge.net/projects/qextserialport/files/ 进行下载,也能够去下载我上传到网上的: http://download.csdn.net/source/176278

创建C#串口通信程序详解

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准的RS 232 C 在PC间通信.它工作在全双工模式下,而且我们不打算使用任何的握手或流控制器,而是使用无modem连接.创建C#串口通信程序的具体实现是如何的呢?让我们开始吧: 创建C#串口通信程序之命名空间 System.IO.Ports命名空间中最重用的是SerialPort 类. 创建C#串

Qt编写串口通信程序

首先说明我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动. 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextserialport/files/ 进行下载,也可以去下载论坛上的 http://www.qtcn.org/bbs/read.php?tid=22847 下

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码

串口屏(触摸屏)组态软件+多台51单片机MODBUS RTU多机串口通信程序源码实现触摸屏(串口屏)与单片机的通讯,主要是解决通讯协议的问题.本文使用开放的Modbus通讯协议,以广州易显的HMImaker触摸屏作主机(Master),单片机作从机(Slaver).HMImaker触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了.触摸屏与单片机之间采用RS-485标准接口直接连接,与多台51单片机MODBUS RTU多机串口通信一.包括如下实例:二

VC++USB及串口通信程序(附工程)

为公司开发产品测试程序,实际上是基于VC++的USB通信及串口通信.当初编写程序时,网上找了很多资料及程序,感觉大都只是说了一点点,没有一个完整的工程以供其他开发者借鉴,完全要靠开发者东拼西凑,最后凑成一个整体工程,还要在这个工程基础上进行相当艰苦的排查问题.解决问题的调试过程.本人对这一过程极其厌烦,现将走完的以上的"艰苦历程"之后的成果列出,以供后来者借鉴. 这一工程中包含了以下知识点: 1. VC++ USB通信: 2. VC++串口通信: 3. 文件(设备)同步异步操作: 4.

51单片机串口通信(字符串接收和发送)

1 #include<reg52.h> 2 3 //------------------串口通信协议-----------------// 4 /* 5 客户端数据包格式解释(长度恒为15): 6 例如:A01_fmq_01Off___# 7 A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种) 8 01-----设备代号 9 fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部 10 #--------

QT 串口通信 数据16进制发送

在QT中进行串口通信时,很多情况要用到发送16进制的数据.从网上找来了一段代码测试能用: static QByteArray QString2Hex(QString str) { QByteArray senddata; int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i<len; ) { hstr=st

C# 编写的串口通信程序

如果,翻看我之前的博客,会找到一篇用I/O模拟IIC通信的程序文章.好吧,如果找不到可以点击这里,这里就不在赘述了,系统也已经完全调试通过了. 今天的任务是,把测试得到的数据在上位机的界面上显示出来,于是键盘手花了两天的时间模仿着巨人的肩膀通过了用C#编写的界面程序,界面很简单就像下面显示的一样. 下面就一步一步给大伙展示一下我的程序吧. C#非常的强大而且友好,串口的通信可以通过编程环境(这里我用的是Visual Studio 2010),如果有需要的话可以给我信息,我有完整版的安装包.如下图