精华内容
下载资源
问答
  • 用C语言实现串口通讯程序
    万次阅读
    2018-01-02 14:03:18

    1. 首先安装虚拟串口vspd软件,用于创建虚拟串口进行互联调试

    2.打开vspd软件,选择COM1和COM4,点击Add pair,把COM1和COM4互联

    3.打开虚拟串口助手,设置串口号为COM1,波特率为19200,其他设置使用默认值,点击连接

    4.用C语言编写串口调试代码,使用COM4


    
    
    typedef struct {
     HANDLE hCom;
     uint32_t baudrate;
     uint32_t bytesize;
     char parity;
     uint32_t stopbit;
    }rs232_device;
    int set_opt(HANDLE hFile, int nSpeed, int nBits, char nEvent, int nStop)
    {
     DCB dcb;
     COMMTIMEOUTS timeouts;
    //set input buf and output buf
     SetupComm(hFile, 512, 512);
    //set read timeout
     timeouts.ReadIntervalTimeout = 1000;
     timeouts.ReadTotalTimeoutMultiplier = 500;
     timeouts.ReadTotalTimeoutConstant = 5000;
    //set write timeout
     timeouts.WriteTotalTimeoutMultiplier = 0;
     timeouts.WriteTotalTimeoutConstant = 2000;
     SetCommTimeouts(hFile, &timeouts);
    //store current setting
        if (0 == GetCommState(hFile, &dcb)){
            return -1;
        }
    //set BaudRate
     switch(nSpeed){
      case 2400:
       dcb.BaudRate = CBR_2400;
       break;
      case 4800:
       dcb.BaudRate = CBR_4800;
       break;
      case 115200:
       dcb.BaudRate = CBR_115200;
       break;
      default:
       dcb.BaudRate = CBR_9600;
       break;
     }
    //set ByteSize
     switch(nBits){
      case 7:
       dcb.ByteSize = 7;
       break;
      case 8:
       dcb.ByteSize = 8;
       break;
      default:
       dcb.ByteSize = 8;
       break;
     }
    //set Parity
     switch(nEvent){
      case 'N':
       dcb.Parity = NOPARITY;
       break;
      case 'O':
       dcb.Parity = ODDPARITY;
       break;
      case 'E':
       dcb.Parity = EVENPARITY;
       break;
     }
    //set StopBit
     switch(nStop){
      case 1:
       dcb.StopBits = ONESTOPBIT;
       break;
      case 2:
       dcb.StopBits = TWOSTOPBITS;
       break;
     }
     if(0 == SetCommState(hFile, &dcb)){
      return -1;
     }
        return 0;
    }
     rs232_device rs232_dev;
     rs232_dev.baudrate = 119200;
     rs232_dev.bytesize = 8;
     rs232_dev.parity = 'N'; 
     rs232_dev.stopbit = 1;
     //打开串口4
     rs232_dev.hCom = CreateFile("COM4",GENERIC_READ |GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
     if (rs232_dev.hCom !=INVALID_HANDLE_VALUE){
      printf("Open COM4 OK!\n");
     }else 
      printf("Open COM4 Fail!\n");
     //通讯设置
     if(-1 == set_opt(rs232_dev.hCom,
         rs232_dev.baudrate,
         rs232_dev.bytesize,
         rs232_dev.parity,
         rs232_dev.stopbit))
     {
      if(INVALID_HANDLE_VALUE != rs232_dev.hCom)
       CloseHandle(rs232_dev.hCom); 
     }
     unsigned char readBuf[1024] = {0};
     char writeBuf[1024] = "Hello Ketty!";
     int count = 100;
     DWORD readsize = 0;
     DWORD writesize = 0;
     int i;
     while(1){
      if(INVALID_HANDLE_VALUE != rs232_dev.hCom){
       printf("Start Read!\n");
       //串口读操作
       ReadFile(rs232_dev.hCom, readBuf, count, &readsize, NULL);
       printf("Read Buf=");
       for(i=0;i<readsize;i++)
        printf("%x ", readBuf[i]);
       printf("\n");
      }
      //串口写操作
      WriteFile(rs232_dev.hCom, writeBuf, count, &writesize, NULL);
     }
    
    
    
    更多相关内容
  • Linux下C语言串口通讯编程示例

    千次阅读 2020-10-20 14:03:42
    (2)设置串口的波特率,数据位,校验位,停止位以及其它设置(如果遵循使用默认的串口设置,此步骤可以省略) (3)读/写数据 (4)关闭串口文件描述符 #include <QCoreApplication> #include <sys/...

     Linux下一切皆文件,读写串口,与读写普通文件本质上来讲是一致的。对于串口的数据读写,大致仍遵循着以下几个步骤:

    (1)打开文件,获取文件描述符

    (2)设置串口的波特率,数据位,校验位,停止位以及其它设置(如果遵循使用默认的串口设置,此步骤可以省略)

    (3)读/写数据

    (4)关闭串口文件描述符

    #include <QCoreApplication>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>
    #include <QString>
    
    #ifdef Q_OS_LINUX
    #include <termios.h>
    #endif
    
    /**
     * @brief set_baudrate  设置波特率
     * @param opt
     * @param baudrate
     */
    static void set_baudrate (struct termios *opt, unsigned int baudrate)
    {
        cfsetispeed(opt, baudrate);
        cfsetospeed(opt, baudrate);
    }
    
    /**
     * @brief set_data_bit  设置数据位
     * @param opt
     * @param databit
     */
    static void set_data_bit (struct termios *opt, unsigned int databit)
    {
        opt->c_cflag &= ~CSIZE;
        switch (databit) {
        case 8:
            opt->c_cflag |= CS8;
            break;
        case 7:
            opt->c_cflag |= CS7;
            break;
        case 6:
            opt->c_cflag |= CS6;
            break;
        case 5:
            opt->c_cflag |= CS5;
            break;
        default:
            opt->c_cflag |= CS8;
            break;
        }
    }
    
    /**
     * @brief set_parity  设置奇偶校验位
     * @param opt
     * @param parity
     */
    static void set_parity (struct termios *opt, char parity)
    {
        switch (parity) {
        case 'N':                  /* no parity check */
            opt->c_cflag &= ~PARENB;
            break;
        case 'E':                  /* even */
            opt->c_cflag |= PARENB;
            opt->c_cflag &= ~PARODD;
            break;
        case 'O':                  /* odd */
            opt->c_cflag |= PARENB;
            opt->c_cflag |= ~PARODD;
            break;
        default:                   /* no parity check */
            opt->c_cflag &= ~PARENB;
            break;
        }
    }
    
    /**
     * @brief set_stopbit   设置停止位
     * @param opt
     * @param stopbit
     */
    static void set_stopbit (struct termios *opt, const char *stopbit)
    {
        if (0 == strcmp (stopbit, "1")) {
            opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
        }	else if (0 == strcmp (stopbit, "1")) {
            opt->c_cflag &= ~CSTOPB; /* 1.5 stop bit */
        }   else if (0 == strcmp (stopbit, "2")) {
            opt->c_cflag |= CSTOPB;  /* 2 stop bits */
        } else {
            opt->c_cflag &= ~CSTOPB; /* 1 stop bit */
        }
    }
    
    /**
     * @brief set_port_attr  com口属性设置,
     * @param fd
     * @param baudrate
     * @param databit
     * @param stopbit
     * @param parity
     * @param vtime
     * @param vmin
     * @return
     */
    int  set_port_attr (
            int fd,
            int  baudrate,          // B1200 B2400 B4800 B9600 .. B115200
            int  databit,           // 5, 6, 7, 8
            const char *stopbit,    //  "1", "1.5", "2"
            char parity,            // N(o), O(dd), E(ven)
            int vtime,
            int vmin )
    {
        struct termios opt;
        tcgetattr(fd, &opt);
        //设置波特率
        set_baudrate(&opt, baudrate);
        opt.c_cflag 		 |= CLOCAL | CREAD;      /* | CRTSCTS */
        //设置数据位
        set_data_bit(&opt, databit);
        //设置校验位
        set_parity(&opt, parity);
        //设置停止位
        set_stopbit(&opt, stopbit);
        //其它设置
        opt.c_oflag 		 = 0;
        opt.c_lflag            	|= 0;
        opt.c_oflag          	&= ~OPOST;
        opt.c_cc[VTIME]     	 = vtime;
        opt.c_cc[VMIN]         	 = vmin;
        tcflush (fd, TCIFLUSH);
        return (tcsetattr (fd, TCSANOW, &opt));
    }
    
    
    /**
     * @brief main
     * @param argc
     * @param argv
     * @return
     */
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
    
        int fd;
        fd = open("/dev/ttyUSB1",O_RDWR);
        if(fd < 0){
            perror("open file failed .");
        }
    
        set_port_attr(fd,9600,8,"N",'1',0,0);
    
        char buf[128] = {0};
        int len = 0;
        QString gps_info;
        while(1){
    
            memset(buf,0,128);
            len = read(fd, buf, sizeof(buf));
            printf("length:%d Text:%s\n",len,buf);
    
            // do something here
            if(QString(buf).contains("GPGGA")|| QString(buf).contains("GPVTG")
                    || QString(buf).contains("GPRMC") || QString(buf).contains("GPGSA"))
            {
                gps_info += QString(buf);
            }
    
            if(QString(buf).contains("GPGSA")){
                printf("\033[1m\033[45;33m [Text]:%s \033[0m\n",gps_info.toStdString().c_str());
                gps_info.clear(); // 最后一帧
            }
    
            usleep(1000*50);
    
        }
        close(fd);
    
    
        return a.exec();
    }
    

    参考:

    (1)https://blog.csdn.net/morixinguan/article/details/80898172

    (2)https://blog.csdn.net/jirryzhang/article/details/70136134

     

    展开全文
  • 串口通信(内含完整的C语言代码)
  • 串口编程(C语言)

    2018-05-10 16:57:58
    Linux下串口编程源代码(C语言) 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)。
  • 在网上搜了很多关于树莓派串口通讯的例子,但是都是python写的,虽然python很有名,而且最近也在学习这门语言,但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打...

    在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言,

    但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。

    还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的,

    驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一样的代码来操作,至少2440和树莓派是通用的。

    分享代码如下:

    #include #include #include #include #include #include #include #include #include #include #include #include"pthread.h"

    #include "serial.h"

    struct serial_config serialread;

    static int serial_fd;

    int speed_arr[] = {B230400, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,

    B38400, B19200, B9600, B4800, B2400, B1200, B300};

    int name_arr[] = {230400, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,

    38400, 19200, 9600, 4800, 2400, 1200, 300};

    //-----------------------------------------------

    //打印配置文件serial.cfg的内容

    //-----------------------------------------------

    void print_serialread()

    {

    printf("serialread.dev is %s\n",serialread.serial_dev);

    printf("serialread.speed is %d\n",serialread.serial_speed);

    printf("serialread.databits is %d\n",serialread.databits);

    printf("serialread.stopbits is %d\n",serialread.stopbits);

    printf("serialread.parity is %c\n",serialread.parity);

    }

    //-----------------------------------------------

    //读取serial.cfg文件并进行配置

    //-----------------------------------------------

    void readserialcfg()

    {

    FILE *serial_fp;

    char j[10];

    printf("readserailcfg\n");

    serial_fp = fopen("./serial.cfg","r");

    if(NULL == serial_fp)

    {

    printf("can't open serial.cfg");

    }

    else

    {

    fscanf(serial_fp, "DEV=%s\n", serialread.serial_dev);

    fscanf(serial_fp, "SPEED=%s\n", j);

    serialread.serial_speed = atoi(j);

    fscanf(serial_fp, "DATABITS=%s\n", j);

    serialread.databits = atoi(j);

    fscanf(serial_fp, "STOPBITS=%s\n", j);

    serialread.stopbits = atoi(j);

    fscanf(serial_fp, "PARITY=%s\n", j);

    serialread.parity = j[0];

    }

    fclose(serial_fp);

    }

    //-----------------------------------------------

    //设置波特率

    //-----------------------------------------------

    void set_speed(int fd)

    {

    int i;

    int status;

    struct termios Opt;

    struct termios oldOpt;

    tcgetattr(fd, &oldOpt);

    //printf("serialread.speed is %d\n",serialread.serial_speed);

    for( i = 0; i < sizeof(speed_arr)/sizeof(int); i++)

    {

    if(serialread.serial_speed == name_arr[i])

    {

    tcflush(fd, TCIOFLUSH);

    cfsetispeed(&Opt, speed_arr[i]);

    cfsetospeed(&Opt, speed_arr[i]);

    status = tcsetattr(fd, TCSANOW, &Opt);

    if(status != 0)

    {

    perror("tcsetattr fd1");

    return;

    }

    tcflush(fd, TCIOFLUSH);

    }

    }

    }

    //-----------------------------------------------

    //设置其他参数

    //-----------------------------------------------

    int (int fd)

    {

    struct termios options;

    struct termios oldoptions;

    if(tcgetattr(fd, &oldoptions) != 0)

    {

    perror("SetupSerial 1");

    return(FALSE);

    }

    options.c_cflag |= (CLOCAL|CREAD);

    options.c_cflag &=~CSIZE;

    //printf("serialread.databits is %d\n",serialread.databits);

    switch(serialread.databits)

    {

    case 7:

    options.c_cflag |= CS7;

    break;

    case 8:

    options.c_cflag |= CS8;

    break;

    default:

    options.c_cflag |= CS8;

    fprintf(stderr, "Unsupported data size\n");

    return(FALSE);

    }

    //printf("serialread.parity is %c\n",serialread.parity);

    switch(serialread.parity)

    {

    case 'n':

    case 'N':

    options.c_cflag &= ~PARENB;

    options.c_iflag &= ~INPCK;

    break;

    case 'o':

    case 'O':

    options.c_cflag |= (PARODD | PARENB);

    options.c_iflag |= INPCK;

    break;

    case 'e':

    case 'E':

    options.c_cflag |= PARENB;

    options.c_cflag &= ~PARODD;

    options.c_iflag |= INPCK;

    break;

    default:

    options.c_cflag &= ~PARENB;

    options.c_iflag &= ~INPCK;

    fprintf(stderr, "Unsupported parity\n");

    return(FALSE);

    }

    //printf("serialread.stopbits is %d\n",serialread.stopbits);

    switch(serialread.stopbits)

    {

    case 1:

    options.c_cflag &= ~CSTOPB;

    break;

    case 2:

    options.c_cflag |= CSTOPB;

    break;

    default:

    options.c_cflag &= ~CSTOPB;

    fprintf(stderr, "Unsupported stop bits\n");

    return(FALSE);

    }

    if(serialread.parity != 'n')

    options.c_iflag |= INPCK;

    options.c_cc[VTIME] = 0;//150;//15 seconds

    options.c_cc[VMIN] = 0;

    #if 1

    options.c_iflag |= IGNPAR|ICRNL;

    options.c_oflag |= OPOST;

    options.c_iflag &= ~(IXON|IXOFF|IXANY);

    #endif

    tcflush(fd, TCIFLUSH);

    if(tcsetattr(fd, TCSANOW, &options) != 0)

    {

    perror("SetupSerial 3");

    return(FALSE);

    }

    return(TRUE);

    }

    //-----------------------------------------------

    //打开串口设备

    //-----------------------------------------------

    int OpenDev(char *Dev)

    {

    int fd = open(Dev, O_RDWR, 0);

    if(-1 == fd)

    {

    perror("Can't Open Serial Port");

    return -1;

    }

    else

    return fd;

    }

    //--------------------------------------------------

    //串口初始化

    //--------------------------------------------------

    void serial_init()

    {

    char *Dev;

    int i;

    readserialcfg();

    //print_serialread();

    printf("init serial\n");

    Dev = serialread.serial_dev;

    //打开串口设备

    serial_fd = OpenDev(Dev);

    if(serial_fd > 0)

    set_speed(serial_fd);//设置波特率

    else

    {

    printf("Can't Open Serial Port!\n");

    exit(0);

    }

    //恢复串口未阻塞状态

    if (fcntl(serial_fd, F_SETFL, O_NONBLOCK) < 0)

    {

    printf("fcntl failed!\n");

    exit(0);

    }

    //检查是否是终端设备

    #if 0//如果屏蔽下面这段代码,在串口输入时不会有回显的情况,调用下面这段代码时会出现回显现象。

    if(isatty(STDIN_FILENO)==0)

    {

    printf("standard input is not a terminal device\n");

    }

    else

    printf("isatty success!\n");

    #endif

    //设置串口参数

    if(set_Parity(serial_fd) == FALSE)

    {

    printf("Set parity Error\n");

    exit(1);

    }

    }

    int serial_write(char* cmd, int count)

    {

    printf("serial write for %d bytes\n",count);

    return write(serial_fd,cmd,count);

    }

    void serial_close()

    {

    printf("close serial\n");

    close(serial_fd);

    }

    /*

    void serial_rw()

    {

    int i;

    char buff[512];

    int nread,nwrite;

    char buff2[] = "hello!\n";

    nwrite = write(serial_fd,buff2,sizeof(buff2));

    printf("nwrite=%d\n",nwrite);

    while(1)

    {

    if((nread = read(serial_fd,buff,512))>0)

    {

    buff[nread] = '\0';

    #if 1//调用这段代码可以实现回显,如果配合上面的回显,就会出现回显两次的情况。

    write(serial_fd,buff,nread);

    #endif

    printf("recv:%d\n",nread);

    #if 1

    for(i=0;i

    当然,还需要对应的头文件:

    #define FALSE0

    #define TRUE1

    #define WORDLEN 32

    struct serial_config

    {

    unsigned char serial_dev[WORDLEN];

    unsigned int serial_speed;

    unsigned char databits;

    unsigned char stopbits;

    unsigned char parity;

    };

    void serial_init();

    int serial_write(char* cmd, int count);

    void serial_close();

    以及分离出来的配置文件:

    DEV=/dev/ttyAMA0

    SPEED=9600

    DATABITS=8

    STOPBITS=1

    PARITY=N

    看到c文件可以发现,main函数被注释了,因为是编译的整个系统,这个文件只提供接口,所以没有main函数,如果需要,可以去掉注释。

    内容很粗糙,有时间再修缮

    展开全文
  • windows C语言串口

    2017-07-29 00:24:41
    windows C语言串口
  • 在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和...

    在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言的方便。

    在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)

    的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)进行如下简单的编码:

    0H:发送的是新的半个字节数据

    1H:重新发送上次传送错误的数据

    2H:文件名结束

    3H:文件结束

    这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通过信息位来区分。下面就是用C语言编写控制串行口的程序。

    #include "dos.h"

    #include "stdlib.h"

    #include "stdio.h"

    #define PORT 0

    void SendFile(char *fname); /* 发送文件*/

    void Send(int s); /*发送一个字节*/

    void SendFileName(char *fname); /*发送文件名*/

    void ReceiveFile(); /*接收文件*/

    void GetFileName(char *f); /*接收文件名*/

    void InitPort(int port,unsigned char para); /*初始化端口*/

    void SendPort(int port,char c); /*端口发送*/

    int ReadPort(int port); /*读端口字节*/

    int CheckState(int port); /*检查端口状态*/

    int Receive(int port,int *G); /*接收一个字节*/

    main(int argc,char *argv[])

    {

    if(argc<2){

    printf("Please input R(receive) or S(sent) parametre:");

    exit(1);

    }

    InitPort(PORT,231);

    if(*argv[1]==''''S'''') /*检查选择的有效性*/

    SendFile(argv[2]);

    else if(*argv[1]==''''R'''')

    ReceiveFile();

    else{

    printf("Error parament.Please input again.");

    exit(1);

    }

    }

    void SendFile(char *fname)

    {

    FILE *fp;

    int ch,s;

    if((fp=fopen(fname,"rb"))==NULL)

    {

    printf("Can''''t open the file.\n");

    exit(1);

    }

    SendFileName(fname);

    do{

    ch=(int)getc(fp);

    if(ferror(fp)){

    printf("Error reading file.\n");

    break;

    }

    s=ch%16; /*取文件中一个字节的低4位*/

    Send(s);

    s=ch/16; /*取文件中一个字节的高4位*/

    Send(s);

    }while(!feof(fp));

    s=46; /*发送文件结束信息*/

    Send(s);

    Send(s);

    fclose(fp);

    }

    void Send(s)

    int s;

    {

    int G;

    SendPort(PORT,s);

    G=ReadPort(PORT); /*等待握手信号*/

    if(s!=G)

    s=s+16;

    do{

    SendPort(PORT,s);

    G=ReadPort(PORT);/*等待握手信号*/

    }while(s!=G);

    }

    void SendFileName(fname)

    char *fname;

    {

    int s,ch;

    printf("Now transmit the file.Please wait...");

    while(*fname){

    ch=(int)fname++;

    s=ch%16; /*取文件名中一个字节的低4位*/

    Send(s);

    s=ch/16;

    Send(s); /*取文件名中一个字节的低4位*/

    }

    s=32; /*发送文件名结束标志*/

    Send(s);

    Send(s);

    }

    void ReceiveFile(){

    FILE *fp;

    char ch;

    int G1,G2,G3;

    char fname[15];

    GetFileName(fname);

    printf("Receiving file %s.\n",fname);

    remove(fname);

    if((fp=fopen(fname,"wb"))==NULL)

    {

    printf("Can''''t open output file.\n");

    exit(1);

    }

    /*循环为检测每次接受的数据是否为新数据,如果不是,*/

    /*则用此次接收的数据覆盖上次接收的数据*/

    G1=ReadPort(PORT);

    G2=Receive(PORT,&G1);

    do{

    G3=Receive(PORT,&G2);

    ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/

    putc(ch,fp);

    if(ferror(fp)){

    printf("\nError writing file.");

    exit(1);

    }

    G2=Receive(PORT,&G3);

    G1=G3;

    }while(G1/16!=48);

    printf("\nTransmit finished.");

    fclose(fp);

    }

    int Receive(port,G)

    int port,*G;

    {

    int GM;

    SendPort(port,*G);

    GM=ReadPort(port);

    if(GM/16==0)

    return GM;

    else if(GM/16==1){

    do{

    *G=GM;

    SendPort(port,GM);

    GM=ReadPort(port);

    }while(GM/16==1);

    }

    return GM;

    }

    void GetFileName(char *f)

    {

    int G1,G2,G3;

    char ch;

    G1=ReadPort(PORT);

    G2=ReadPort(PORT);

    do{

    G3=Receive(PORT,&G3);

    ch=(char)(G1%16+G2/16);

    *f=ch;

    *f++;

    G2=Receive(PORT,&G3);

    G1=G3;

    }while(G1/16!=32);

    printf("File name transmit finished.\n");

    }

    void InitPort(port,para)

    int port;

    unsigned char para;

    {

    union REGS reg;

    reg.x.dx=port;

    reg.h.ah=0;

    reg.h.al=para;

    int86(0x14,?,?);

    }

    void SendPort(port,c)

    int port;

    char c;

    {

    union REGS reg;

    reg.x.dx=port;

    reg.h.al=c;

    reg.h.ah=1;

    int86(0x14,?,?);

    if(reg.h.ah&128){

    printf("\nSend mistakes!");

    exit(1);

    }

    }

    int ReadPort(port)

    int port;

    {

    union REGS reg;

    while(!(CheckState(port)&256)){

    if(kbhit()){/*如端口长期无数据可人为终止等待*/

    printf("Press any key to exit.");

    getch();

    exit(1);

    }

    }

    reg.x.dx=port;

    reg.h.ah=2;

    int86(0x14,?,?);

    if(reg.h.ah&128){

    printf("\nRead mistake!");

    exit(1);

    }

    return reg.h.al;

    }

    int CheckState(port)

    int port;

    {

    union REGS reg;

    reg.x.dx=port;

    reg.h.ah=3;

    int86(0x14,?,?);

    return reg.x.ax;

    }在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬

    件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言

    作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和高级语言

    的方便。

    在通讯中,为了保证行运安全可靠,标准的串行口必须具有许多握手信号和

    状态信息。这是因为通讯的各个计算机CPU速度不一样(这会导致“错帧”)以

    及发送机发送数据速度比接收机接收速度快(这会导致“过冲”)。为解决这个

    问题,我们采用一个简单的握手信号,即发送机每次仅发送半个字节(低4位)

    的数据,而另外半个字节(高4位)则用来传送信息。我们可以对信息位(高4位)

    进行如下简单的编码:

    0H:发送的是新的半个字节数据

    1H:重新发送上次传送错误的数据

    2H:文件名结束

    3H:文件结束

    这样,每当发送机发送一个字节以后,就等待接受机发回送信号,这回送信号就

    是发送机发送过来的那个字节。发送机接收到回送信号后,把它与刚发送的字节

    相比较,如果相同,就发送新的半个字节,否则就重新发送。新数据与旧数据通

    过信息位来区分。下面就是用C语言编写控制串行口的程序。

    #include "dos.h"

    #include "stdlib.h"

    #include "stdio.h"

    #define PORT 0

    void SendFile(char *fname); /* 发送文件*/

    void Send(int s); /*发送一个字节*/

    void SendFileName(char *fname); /*发送文件名*/

    void ReceiveFile(); /*接收文件*/

    void GetFileName(char *f); /*接收文件名*/

    void InitPort(int port,unsigned char para); /*初始化端口*/

    void SendPort(int port,char c); /*端口发送*/

    int ReadPort(int port); /*读端口字节*/

    int CheckState(int port); /*检查端口状态*/

    int Receive(int port,int *G); /*接收一个字节*/

    main(int argc,char *argv[])

    {

    if(argc<2){

    printf("Please input R(receive) or S(sent) parametre:");

    exit(1);

    }

    InitPort(PORT,231);

    if(*argv[1]==''''S'''') /*检查选择的有效性*/

    SendFile(argv[2]);

    else if(*argv[1]==''''R'''')

    ReceiveFile();

    else{

    printf("Error parament.Please input again.");

    exit(1);

    }

    }

    void SendFile(char *fname)

    {

    FILE *fp;

    int ch,s;

    if((fp=fopen(fname,"rb"))==NULL)

    {

    printf("Can''''t open the file.\n");

    exit(1);

    }

    SendFileName(fname);

    do{

    ch=(int)getc(fp);

    if(ferror(fp)){

    printf("Error reading file.\n");

    break;

    }

    s=ch%16; /*取文件中一个字节的低4位*/

    Send(s);

    s=ch/16; /*取文件中一个字节的高4位*/

    Send(s);

    }while(!feof(fp));

    s=46; /*发送文件结束信息*/

    Send(s);

    Send(s);

    fclose(fp);

    }

    void Send(s)

    int s;

    {

    int G;

    SendPort(PORT,s);

    G=ReadPort(PORT); /*等待握手信号*/

    if(s!=G)

    s=s+16;

    do{

    SendPort(PORT,s);

    G=ReadPort(PORT);/*等待握手信号*/

    }while(s!=G);

    }

    void SendFileName(fname)

    char *fname;

    {

    int s,ch;

    printf("Now transmit the file.Please wait...");

    while(*fname){

    ch=(int)fname++;

    s=ch%16; /*取文件名中一个字节的低4位*/

    Send(s);

    s=ch/16;

    Send(s); /*取文件名中一个字节的低4位*/

    }

    s=32; /*发送文件名结束标志*/

    Send(s);

    Send(s);

    }

    void ReceiveFile(){

    FILE *fp;

    char ch;

    int G1,G2,G3;

    char fname[15];

    GetFileName(fname);

    printf("Receiving file %s.\n",fname);

    remove(fname);

    if((fp=fopen(fname,"wb"))==NULL)

    {

    printf("Can''''t open output file.\n");

    exit(1);

    }

    /*循环为检测每次接受的数据是否为新数据,如果不是,*/

    /*则用此次接收的数据覆盖上次接收的数据*/

    G1=ReadPort(PORT);

    G2=Receive(PORT,&G1);

    do{

    G3=Receive(PORT,&G2);

    ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/

    putc(ch,fp);

    if(ferror(fp)){

    printf("\nError writing file.");

    exit(1);

    }

    G2=Receive(PORT,&G3);

    G1=G3;

    }while(G1/16!=48);

    printf("\nTransmit finished.");

    fclose(fp);

    }

    int Receive(port,G)

    int port,*G;

    {

    int GM;

    SendPort(port,*G);

    GM=ReadPort(port);

    if(GM/16==0)

    return GM;

    else if(GM/16==1){

    do{

    *G=GM;

    SendPort(port,GM);

    GM=ReadPort(port);

    }while(GM/16==1);

    }

    return GM;

    }

    void GetFileName(char *f)

    {

    int G1,G2,G3;

    char ch;

    G1=ReadPort(PORT);

    G2=ReadPort(PORT);

    do{

    G3=Receive(PORT,&G3);

    ch=(char)(G1%16+G2/16);

    *f=ch;

    *f++;

    G2=Receive(PORT,&G3);

    G1=G3;

    }while(G1/16!=32);

    printf("File name transmit finished.\n");

    }

    void InitPort(port,para)

    int port;

    unsigned char para;

    {

    union REGS reg;

    reg.x.dx=port;

    reg.h.ah=0;

    reg.h.al=para;

    int86(0x14,?,?);

    }

    void SendPort(port,c)

    int port;

    char c;

    {

    union REGS reg;

    reg.x.dx=port;

    reg.h.al=c;

    reg.h.ah=1;

    int86(0x14,?,?);

    if(reg.h.ah&128){

    printf("\nSend mistakes!");

    exit(1);

    }

    }

    int ReadPort(port)

    int port;

    {

    union REGS reg;

    while(!(CheckState(port)&256)){

    if(kbhit()){/*如端口长期无数据可人为终止等待*/

    printf("Press any key to exit.");

    getch();

    exit(1);

    }

    }

    reg.x.dx=port;

    reg.h.ah=2;

    int86(0x14,?,?);

    if(reg.h.ah&128){

    printf("\nRead mistake!");

    exit(1);

    }

    return reg.h.al;

    }

    int CheckState(port)

    int port;

    {

    union REGS reg;

    reg.x.dx=port;

    reg.h.ah=3;

    int86(0x14,?,?);

    return reg.x.ax;

    }

    展开全文
  • C语言实现串口通信

    千次阅读 2021-07-13 12:54:18
    串口通信2.struct termios 结构体2.1 c_iflag 输入模式标志2.2 c_oflag 输出模式标志2.3 c_cflag 控制模式标志2.4 c_lflag 区域模式标志或本地模式标志或局部模式2.4 c_cc[NCC] 控制字符特性2.5 tcsetattr() 与 ...
  • C语言与电脑串口通讯

    2010-04-23 23:51:19
    这是一个用C语言来控制计算机串口的教程,主要讲怎么样调用系统函数来与串口缓冲区通讯和控制串口
  • c语言串口通信编程_串口编程语言

    千次阅读 2020-07-19 19:32:02
    c语言串口编程 介绍 (Introduction) 尽管这是一项旧技术,但许多硬件制造商仍在使用串行端口。 If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the ...
  • 在Windows下使用Win32API实现异步串口通讯,包括C语言代码的分析
  • C语言串口通信源代码

    2021-05-22 13:42:55
    1、#include #include #include #include #define ... 《C语言串口通信源代码》由会员206****923分享,可在线阅读,更多相关《C语言串口通信源代码》请在金锄头文库上搜索。
  • 通过pc端的c++语言编程实现与单片机的通讯,可用于pc端c++处理程序后给单片机发送一个trigger...可以通过UartAssist.exe串口调试助手观察板子上接收到的信息(此步需要再使用单片机上面的一个串口来连接串口助手)。
  • c语言操作串口支持485/232 c语言操作串口支持485/232 c语言操作串口支持485/232 c语言操作串口支持485/232 c语言操作串口支持485/232
  • 51单片机串口通讯C语言源码,其中串口测试程序完成串口发送任意字符到单片机,单片机通过P0口LED灯显示。比如 发送16进制的 00 单片机的LED灯全亮 发送FF灯全灭 首先 烧写程序到单片机 晶振 11.0592MHZ 连接好串口...
  • 串口编程--C语言串口读取数据

    千次阅读 2020-12-02 09:23:25
    串口编程1、通讯流程2、demo 1、通讯流程 ①、打开串口 ②、设置波特率 ③、设置奇偶校验位、停止位、数据位等 ④、读写数据 ⑤、关闭串口 2、demo 本示例串口文件根据自己实际情况打开,方可读写成功,需要注意 #...
  • c语言 串口通讯

    千次阅读 2018-02-05 22:44:42
    接收串口数据程序的编程逻辑示意图; 2.接收串口数据程序要用到的通用函数模块(可直接引用,无需更改); 3.接收串口数据程序的示例。1.接收串口数据程序的编程逻辑示意图:2.与串口有关的函数模块及数组(可直接...
  • 描述0前言串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USB口的日趋流行,RS232接口串口作为一种传统的串口通信口有被取代的趋势。然而由于它...
  • 单片机C语言程序设计 单片机与PC机串口通讯仿真(有源码)单片机C语言程序设计 单片机与PC机串口通讯仿真(有源码)单片机C语言程序设计 单片机与PC机串口通讯仿真(有源码)单片机C语言程序设计 单片机与PC机串口通讯...
  • 来源:河北工业大学 作者:葛磊蛟,毛一之,李歧,高婧嫱前言串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USE口的日趋流行,RS232接口串口...
  • 用C语言编写串口程序

    2021-05-19 11:37:34
    在当今,流行的编程软件种类繁多,它们编程方便、易于维护,但是在与硬件直接打交道和编制系统软件时却束手无策,于是C语言就有了用武之地。C语言作为汇编语言与高级语言之间的一种过渡语言,兼有汇编语言的高效和...
  • 基于C语言串口通讯程序设计年 月 传 感 技 术 学 报 第 期’__’ ^ -!"#$%&’())*+$,%-$(+.#(/#%))$+/0"1$/...
  • 串口通信入门

    2021-05-19 13:06:21
    1.波特率串口通信就是单片机与电脑端,单片机与单片机,单片机与模块器件之间互发信息进行通信,比如单片机发送一个“1”的字符给电脑端,电脑端的窗口就会接收到“1”。我们常用的波特率为9600,所谓9600指的是...
  • 其实那个串口是一个很复杂的东西的,这玩意不是一两句话就说得清楚的。如果要真的搞明白它,非看一本厚厚的书不可,把它完全描述出来也可以写一本书了。在Linux下,有一个很大的好处,所有的硬件设备都虚拟成了一个...
  • 一、准备: ...3、也可以用串口助手和程序进行调试 二、文件: 1、 man.c 主程序 2、serial.h 头文件 3、serial.c 函数定义文件 三、代码 man.c #include <stdio.h> #include <windows.h> #
  • int open_port(int fd,int comport){char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/...if(comport==0){//串口0fd=open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);if(-1==fd){perror("Can't Open Serial P...
  • 摘要:VC/C++源码,其它分类,单片机控制 51单片机串口通讯C语言源码,其中串口测试程序完成串口发送任意字符到单片机,单片机通过P0口LED灯显示。比如 发送16进制的 00 单片机的LED灯全亮 发送FF灯全灭  首先 烧写...
  • 基于Linux使用C语言实现的一个串口通讯Demo,实测可用。
  • 串口”作为C语言嵌入式中的重要的通信方式,一直是面试官考察C语言软件工程师能力重要标志。小编我当时就被问懵逼了。串口串口通信”是指串行通信,它的优点是“使用的资源少(占用的引脚少)”,它的缺点是“传输...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,591
精华内容 2,236
关键字:

如何用c语言串口通讯