精华内容
下载资源
问答
  • 打开串口: fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY); fcntl(fd, F_SETFL, 0); O_NOCTTY选项防止程序受键盘控制中止操作键等影响。 O_NDELAY告诉 UNIX 不必另一端端口是否启用。(检测 DCD信号线状态)2...

    1。打开串口: fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY); fcntl(fd, F_SETFL, 0); O_NOCTTY

    选项防止程序受键盘控制中止操作键等影响。 O_NDELAY

    告诉 UNIX 不必另一端端口是否启用。

    (检测 DCD信号线状态)

    2。往串口发送数据n = write(fd, "ATZ\r", 4);

    3。从串口读取数据当以原始数据模式(raw data mode)打开串口时,read 系统调用将不管串口输入缓存里有多少字符可读都返回。若没有数据,则阻塞直至有字符到来,或定时器超时。

    串口设置这个选项后,read 调用都是立即返回。没有数据可读时,read 返回 0 fcntl(fd, F_SETFL, FNDELAY);

    解除这个功能是

    fcntl(fd, F_SETFL, 0); 4。关闭串口

    close(fd);

    标准的 POSIX 配置串口参数串口收发数据主要是要做好端口配置工作,需要包含,定义终端控制结构以及

    POSIX控制函数

    termios结构

    Table 3 - Termios Structure Members

    Member Description

    c_cflag Control options

    c_lflag Line options

    c_iflag Input options

    c_oflag Output options

    c_cc Control characters

    c_ispeed Input baud (new interface)

    c_ospeed Output baud (new interface)

    struct termios termios_old,termios_new;

    1)获取串口属性

    tcgetattr(fdcom, &termios_old);

    2)配置输入速率

    cfsetispeed(&termios_new, baudrate); cfsetospeed(&termios_new, baudrate); 3)

    控制模式,保证程序不会成为端口的占有者termios_new。

    c_cflag |= CLOCAL;控制模式,使能端口读取输入的数据termios_new。c_cflag |= CREAD; 4)

    控制模式,屏蔽字符大小位,设置串口传输数据所用的位数termios_new。c_cflag &= ~CSIZE; termios_new。

    c_cflag |= CS5;

    //CS6,CS7,CS8

    5)奇偶校验parity check

    //无奇偶校验

    termios_new。c_cflag &= ~PARENB ;

    //偶校验

    termios_new。c_cflag |= PARENB; termios_new。

    c_cflag &= PARODD;

    //奇校验

    termios_new。c_cflag |= PARENB; termios_new。c_cflag |= PARODD;

    6)设置停止位

    termios_new。c_cflag |= CSTOPB;

    //2stop bits termios_new。

    c_cflag &= ~CSTOPB;

    //1 stop bits。

    7)其他属性配置

    termios_new。c_oflag &= ~OPOST;

    //输出模式,原始数据输出termios_new。c_cc[VMIN] = 1;

    //控制字符,所要读取字符的最小数量termios_new。

    c_cc[VTIME] = 1;//控制字符,读取第一个字符的等待时间,以 0。

    1 妙为单

    8)设置新属性

    tcsetattr(fdcom, TCSANOW, &termios_new);

    // TCSANOW:所由改变立即生效

    //TCSADRAIN:等待所有东西都被发送出去后设置

    //TCSAFLUSH:将输入输出buffer全部溢出后设置

    采用 select 系统调用读取串口数据跟其他 socket,设备数据。

    全部

    展开全文
  • linux串口操作函数

    2021-05-13 08:31:44
    1.打开串口:fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY);fcntl(fd, F_SETFL, 0);O_NOCTTY 选项防止程序受键盘控制中止操作键等影响.O_NDELAY 告诉 UNIX 不必另一端端口是否启用.(检测 DCD信号线状态)2....

    1.打开串口:

    fd = open("/dev/ttyf1", O_RDWR | O_NOCTTY | O_NDELAY);

    fcntl(fd, F_SETFL, 0);

    O_NOCTTY  选项防止程序受键盘控制中止操作键等影响.

    O_NDELAY  告诉 UNIX 不必另一端端口是否启用.(检测 DCD信号线状态)

    2.往串口发送数据

    n = write(fd, "ATZ\r", 4);

    3.从串口读取数据

    当以原始数据模式(raw data mode)打开串口时,read 系统调用将不管串口输入缓存里有

    多少字符可读都返回.若没有数据,则阻塞直至有字符到来,或定时器超时.

    串口设置这个选项后,read 调用都是立即返回.没有数据可读时,read 返回 0

    fcntl(fd, F_SETFL, FNDELAY);

    解除这个功能是

    fcntl(fd, F_SETFL, 0);

    4.关闭串口

    close(fd);

    二.标准的 POSIX 配置串口参数

    串口收发数据主要是要做好端口配置工作,需要包含,定义终端控制结构以及

    POSIX 控制函数

    termios结构

    Table 3 - Termios Structure Members

    Member  Description

    c_cflag  Control options

    c_lflag  Line options

    c_iflag  Input options

    c_oflag  Output options

    c_cc  Control characters

    c_ispeed  Input baud (new interface)

    c_ospeed  Output baud (new interface)

    struct termios termios_old,termios_new;

    1)  获取串口属性

    tcgetattr(fdcom, &termios_old);

    2)  配置输入速率

    cfsetispeed(&termios_new, baudrate);

    cfsetospeed(&termios_new, baudrate);

    3)  控制模式,保证程序不会成为端口的占有者

    termios_new.c_cflag |= CLOCAL;

    控制模式,使能端口读取输入的数据

    termios_new.c_cflag |= CREAD;

    4)  控制模式,屏蔽字符大小位,设置串口传输数据所用的位数

    termios_new.c_cflag &= ~CSIZE;

    termios_new.c_cflag |= CS5;        //CS6,CS7,CS8

    5)  奇偶校验      parity check

    //无奇偶校验

    termios_new.c_cflag &= ~PARENB ;

    //偶校验

    termios_new.c_cflag |= PARENB;

    termios_new.c_cflag &= PARODD;

    //奇校验

    termios_new.c_cflag |= PARENB;

    termios_new.c_cflag |= PARODD;

    6)  设置停止位

    termios_new.c_cflag |= CSTOPB;       //2stop bits

    termios_new.c_cflag &= ~CSTOPB;    //1 stop bits.

    7)  其他属性配置

    termios_new.c_oflag &= ~OPOST;       //输出模式,原始数据输出

    termios_new.c_cc[VMIN] = 1;         //控制字符,所要读取字符的最小数量

    termios_new.c_cc[VTIME] = 1;//控制字符,读取第一个字符的等待时间,以 0.1 妙为单

    8)  设置新属性

    tcsetattr(fdcom, TCSANOW, &termios_new);

    // TCSANOW: 所由改变立即生效

    //TCSADRAIN:  等待所有东西都被发送出去后设置

    //TCSAFLUSH:  将输入输出 buffer全部溢出后设置

    采用 select 系统调用读取串口数据跟其他 socket,设备数据

    示例:

    假定我们要从一个串口和一个 socket 读取数据.需要判断每个文件描述符的输入数据情

    况,但 10 妙内无数据的话,需要通知用户没有数据可读.

    /* Initialize the input set */

    FD_ZERO(input);

    FD_SET(fd, input);

    FD_SET(socket, input);

    max_fd = (socket > fd ? socket : fd) + 1;

    /* Initialize the timeout structure */

    timeout.tv_sec  = 10;

    timeout.tv_usec = 0;

    /* Do the select */

    n = select(max_fd,    NULL, NULL, ;

    /* See if there was an error */

    if (n 0)

    perror("select failed");

    else if (n == 0)

    puts("TIMEOUT");

    else

    {

    /* We have input */

    if (FD_ISSET(fd, input))

    process_fd();

    if (FD_ISSET(socket, input))

    process_socket();

    }

    三.unix/linux下,采用 ioctl函数来实现串口配置功能

    int ioctl(int fd, int request, ...);

    fd 是串口描述符,request参数是定义在的常量,一般是下表中的一个

    Table 10 - IOCTL Requests for Serial Ports

    Request  Description  POSIX Function

    TCGETS

    Gets the current serial

    port settings.

    tcgetattr

    TCSETS

    Sets the serial port

    settings immediately.

    tcsetattr(fd, TCSANOW, &options)

    TCSETSF

    Sets the serial port

    settings after flushing the

    input and output buffers.

    tcsetattr(fd, TCSAFLUSH, &options)

    TCSETSW

    Sets the serial port

    settings after allowing

    the input and output

    buffers to drain/empty.

    tcsetattr(fd, TCSADRAIN, &options)

    TCSBRK

    Sends a break for the

    given time.

    tcsendbreak, tcdrain

    TCXONC

    Controls software flow

    control.

    tcflow

    TCFLSH

    Flushes the input and/or

    output queue.

    tcflush

    TIOCMGET

    Returns the state of the

    "MODEM" bits.

    None

    TIOCMSET

    Sets the state of the

    "MODEM" bits.

    None

    FIONREAD

    Returns the number of

    bytes in the input buffer.

    None

    为获取状态位,调用 ioctl函数,用一个整数来存放位指针.

    Listing 5 - Getting the MODEM status bits.

    #include #include int fd;

    int status;

    ioctl(fd, TIOCMGET, &status);

    Listing 6 - Dropping DTR with the TIOCMSET ioctl.

    #include #include int fd;

    int status;

    ioctl(fd, TIOCMGET, &status);

    status &= ~TIOCM_DTR;

    ioctl(fd, TIOCMSET, status);

    展开全文
  • 串口printf系列函数

    2021-05-19 14:36:41
    1.printf系列的函数实现懂得了单片机通过串口传输数据给电脑端窗口查看,那么,有时我们需要发送字符串,有时需要发送一个变量的数值是多少,以及还要发送回车换行这三种情况。所以我们把这三个功能函数封装起来,...

    1.printf系列的函数实现

    懂得了单片机通过串口传输数据给电脑端窗口查看,那么,有时我们需要发送字符串,有时需要发送一个变量的数值是多少,以及还要发送回车换行这三种情况。所以我们把这三个功能函数封装起来,方便后续的串口使用。

    首先笔者写的“void printf_str(u8 *str)”函数就是专门用来发送字符串给电脑端的。

    其次“void printf_num(u32 num)”发送的变量的数值只支持显示十进制数0~4294967295,也就是参数是u32类型。

    最后“void printf_rn()”就是发送回车换行符了。

    关于这三部分的代码大家可以尝试去阅读一下是怎么实现的,如果有很多地方看不懂那么可以不用深究,往下学,笔者会在后面的知识点中讲解其中的运用。

    我们希望串口这部分功能模块也能像定时器那样封装一个单独文件来使用。

    所以创建好“uart.c”和“uart.h”文件,复制以下代码

    2.uart.c的代码#include 

    #include //详见第六章第8讲

    void ConfigUART(u16 baud)

    {

    SCON  = 0x50;  //配置串口为模式1

    TMOD &= 0x0F;  //清零T1的控制位

    TMOD |= 0x20;  //配置T1为模式2

    TH1 = 256 - (11059200/12/32)/baud;//计算T1重载值

    TL1 = TH1;     //初值等于重载值

    ET1 = 0;       //禁止T1中断

    ES  = 1;       //使能串口中断

    TR1 = 1;       //启动T1

    }

    void printf_str(u8 *str)

    {

    while(*str != '\0')//连续发送字符串数据,直到检测到结束符

    {

    SBUF=*str++;

    while(!TI);    //等待字节发送完成TI被置1就退出这个while循环

    TI = 0;        //清0标志位

    }

    }

    void printf_num(u32 num)

    {

    u8 buf[10];

    char i;//取值范围为-128~127

    for (i=0; i<10; i++)       //把长整型数转换为10位十进制的数组

    {

    buf[i] = num % 10;

    num = num / 10;        //舍掉个位数,重新装载

    }

    for (i=9; i>=1; i--)

    {

    if (buf[i] != 0)break; //从最高位起,遇到0不理会,遇到非0则退出循环

    }

    while(i>=0)          //剩余低位都如实发送出去

    {

    SBUF='0'+buf[i]; //如果此时的buf[i]的值是1,那么电脑端窗口在“字符格式”模式下要想显示字符“1”,只需'0'+1,因为‘0’就是ASCII码值48

    while(!TI);      //等待字节发送完成TI被置1就退出这个while循环

    TI = 0;          //清0标志位

    i--;

    }

    }

    void printf_rn() //发送回车换行符

    {

    SBUF='\r';

    while(!TI);  //等待字节发送完成TI被置1就退出这个while循环

    TI = 0;      //清0标志位

    SBUF='\n';

    while(!TI);  //等待字节发送完成TI被置1就退出这个while循环

    TI = 0;      //清0标志位

    }

    3.uart.h的代码#ifndef __UART_H__

    #define __UART_H__

    void ConfigUART(u16 baud);

    void printf_str(u8 *str);//发送字符串

    void printf_num(u32 num);//发送参数的数值

    void printf_rn();        //发送回车换行符

    #endif

    4.main.c的代码#include 

    #include //详见第六章第8讲

    #include 

    void main()

    {

    u8 key;

    u32 value=65535;

    LED_Init();//初始化LED硬件模块

    KEY_Init();//初始化按键模块

    EA = 1;    //闭合总中断开关

    ConfigUART(9600);

    while(1)

    {

    key=KEY_Scan(0,1000);

    if(key==4)

    {

    printf_str("value=");//发送字符串

    printf_num(value);   //发送变量的数值

    printf_rn();         //发送回车换行符

    value++;

    }

    }

    }

    void InterruptUART() interrupt 4

    {

    if (RI)    //接收到字节

    {

    RI = 0;//手动清零接收中断标志位

    }

    }

    在串口中断函数中我们没有再写“if(TI){ TI = 0; }”,那是因为我们在所有的发送函数中都做了TI的清0处理,所以可以在串口中断函数中不用再书写TI。

    大家别忘了创建好“uart.c”和“uart.h”之后要添加到工程文件中

    747ed91fae7cceb59673439728465bcd.png

    打开串口,选择“字符格式显示”模式,不断按K4,不停打印出如下内容

    007ec44743d95016945b6f6beac078ea.png

    展开全文
  • 本文总结了Arduino常用串口操作函数函数说明部分来源于Arduino 官网串口使用指南,示例与实验部分为自编。本文是对Arduino串口操作函数的较全面总结,可作为工具贴查找使用。 1.串口设置 Serial.begin(); 说明 ...

    本文总结了Arduino常用串口操作函数,函数说明部分来源于Arduino 官网串口使用指南,示例与实验部分为自编。本文是对Arduino串口操作函数的较全面总结,可作为工具贴查找使用。

    1.串口设置(初始化串口,开启串口,通常置于setup()函数中)
    Serial.begin();

    语法:

    Serial.begin(speed);  
    Serial.begin(speed,config); 
    参数:
    speed: 波特率,300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600,115200
    config: 设置数据位、校验位和停止位。
    例如Serial.begin(speed,Serial_8N1);  
    Serial_8N1中:8表示8个数据位,N表示没有校验,1表示有1个停止位。
    返回:无
    

    示例

    void setup() { 
    Serial.begin(9600); // 开启串口,定义波特率9600 
    }
    

    2.串口设置(禁止串口传输函数。此时串口传输的pin脚可以作为数字IO脚使用。)
    Serial.end();
    语法 :

    Serial.end()
    参数:无
    返回 :无
    

    3.清空串口缓存(1.0版本之前为清空串口缓存,现在该函数作用为等待输出数据传送完毕。如果要清空串口缓存的话,可以使用:****while(Serial.read() >= 0)****来代替。)
    Serial.flush();
    语法

    Serial.flush ()
    参数:无
    返回 :无
    
    while(Serial.read()>= 0){}
    

    说明
    因Serial.read()函数读取串口缓存中的一个字符,并删除已读字符,如果清空了返回值为-1。因此可以用这句代码来清空串口缓存。实验代码详见下文代码。

    4.输出串口数据(串口输出数据函数,写入字符串数据到串口。)
    Serial.print();

    语法

    Serial.print(val)
    Serial.print(val,format)
    Serial.println(val) 
    Serial.println(val,format)
    参数:
    val: 打印的值,任意数据类型
    format: 输出的数据格式,包括整数类型和浮点型数据的小数点位数。
    返回 :发送字节数量
    

    Serial.print("\n") 和 Serial.println() 等效,相当于多了一个换行符
    示例

    Serial.print(78, BIN) 得到 "1001110"
    Serial.print(78, OCT) 得到 "116"
    Serial.print(78, DEC) 得到 "78"
    Serial.print(78, HEX) 得到 "4E"
    Serial.print(1.23456, 0) 得到 "1"
    Serial.print(1.23456, 2) 得到 "1.23"
    Serial.print(1.23456, 4) 得到 "1.2346"
    Serial.print('N') 得到 "N"
    Serial.print("Hello world.") 得到 "Hello world."
    

    5、串口准备好时触发的事件函数(串口数据准备好时触发的事件函数,即串口数据准备好调用该函数。)
    Serial.SerialEvent();
    语法

    Serial.serialEvent{"statements"} 
    参数 
    statements: 执行任何有效的语句。
    

    6.读串口缓存区数据(判断串口缓冲器的状态函数,用以判断数据是否送达串口。注意使用时通常用delay(100)以保证串口字符接收完毕,即保证Serial.available()返回的是缓冲区准确的可读字节数。)
    Serial.available();
    语法

    Serial.available();
    
    参数:无
    返回:返回缓冲区可读字节数目
    

    示例

    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialbuffer
    }
     
    void loop() {
       if (Serial.available() > 0) {
        delay(100); // 等待数据传完
        int numdata = Serial.available();
        Serial.print("Serial.available = :");
        Serial.println(numdata);
      }
      while(Serial.read()>=0){} //清空串口缓存
    }
    

    7.Serial.read();(读取串口数据,一次读一个字符,读完后删除已读数据。)

    语法

    Serial.read();
    
    参数:无
    返回:返回串口缓存中第一个可读字节,当没有可读数据时返回-1,整数类型。
    

    示例

    char comchar;
     void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}/ /clear serialbuffer
    }
    void loop() {
      // read data from serial port
       while(Serial.available()>0){
        comchar = Serial.read();//读串口第一个字节
        Serial.print("Serial.read: ");
        Serial.println(comchar);
        delay(100); 
        }
     }
    

    8.Serial.peek(); (读串口缓存中下一字节的数据(字符型),但不从内部缓存中删除该数据。也就是说,连续的调用peek()将返回同一个字符。而调用read()则会返回下一个字符。)

    语法

    Serial.peek();
    参数:无
    返回:返回串口缓存中下一字节(字符)的数据,如果没有返回-1,整数int

    示例

    char comchar;
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
     
      while(Serial.available()>0){
        comchar = Serial.peek();
        Serial.print("Serial.peek: ");
        Serial.println(comchar);
        delay(100); 
        }
     }
    

    9.Serial.readBytes(buffer,length);(从串口读取指定长度length的字符到缓存数组buffer。)

    语法

    Serial.readBytes(buffer,length);
    
    参数: buffer: 缓存变量
    	  length:设定的读取长度
    返回:返回存入缓存的字符数,0表示没有有效数据。
    

    示例

    char buffer[18];
    int numdata=0;
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serial port
    }
     
    void loop() {
      // read data from serial port
      if(Serial.available()>0){
          delay(100);
          numdata = Serial.readBytes(buffer,3);
          Serial.print("Serial.readBytes:");
          Serial.println(buffer);    
        }
        // clear serial buffer
      while(Serial.read() >= 0){}
      for(int i=0; i<18; i++){
            buffer[i]='\0';
        }
    }
    

    10.Serial.readBytesUntil(character,buffer,length);(从串口缓存读取指定长度的字符到数组buffer,遇到终止字符character后停止。)

    语法

    Serial.readBytesUntil(character ,buffer,length);
    
    参数:  character : 查找的字符 (char)
    		buffer: 存储读取数据的缓存(char[] 或byte[])
    		length:设定的读取长度
    
    返回:返回存入缓存的字符数,0表示没有有效数据。
    

    示例

    char buffer[18];
    char character = ','; //终止字符
    int numdata=0;
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialport
    }
     
    void loop() {
      // read data from serial port
      if(Serial.available()>0){
          delay(100);
          numdata =Serial.readBytesUntil(character,buffer,3);
          Serial.print("Serial.readBytes:");
          Serial.println(buffer);    
        }
        // clear serial buffer
      while(Serial.read() >= 0){}
      for(int i=0; i<18; i++){
            buffer[i]='\0';
        }
    }
    

    11.Serial.readString();(从串口缓存区读取全部数据到一个字符串型变量。)

    语法

    Serial.readString();
    
    参数:无
    
    返回:返回从串口缓存区中读取的一个字符串。
    

    示例

    String comdata = "";
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){} //clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
      if(Serial.available()>0){
          delay(100);
          comdata = Serial.readString();
          Serial.print("Serial.readString:");
          Serial.println(comdata);
        }
        comdata = "";
    }
    

    12.Serial.readStringUntil();(从串口缓存区读取字符到一个字符串型变量,直至读完或遇到某终止字符。)

    语法

    Serial.readStringUntil(terminator)
    
    参数:terminator:终止字符(cha型)
    返回:从串口缓存区中读取的整个字符串,直至检测到终止字符。
    

    示例

    String comdata = "";
    char terminator = ',';
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){} //clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
      if(Serial.available()>0){
          delay(100);
          comdata =Serial.readStringUntil(terminator);
         Serial.print("Serial.readStringUntil: ");
          Serial.println(comdata);
        }
        while(Serial.read()>= 0){}
    }
    

    13.Serial.parseFloat();(读串口缓存区第一个有效的浮点型数据,数字将被跳过。当读到第一个非浮点数时函数结束。)

    语法

    Serial.parseFloat()
    参数:无None
    
    返回:返回串口缓存区第一个有效的浮点型数据,数字将被跳过。
    

    示例

    float comfloat;
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
      if(Serial.available()>0){
          delay(100);
          comfloat = Serial.parseFloat();
          Serial.print("Serial.parseFloat:");
          Serial.println(comfloat);
        }
        // clear serial buffer
        while(Serial.read() >= 0){}
    }
    

    14.Serial.parseInt()(从串口接收数据流中读取第一个有效整数(包括负数)。)
    注意:
    非数字的首字符或者负号将被跳过
    当可配置的超时值没有读到有效字符时,或者读不到有效整数时,分析停止
    如果超时且读不到有效整数时,返回0

    语法

    Serial.parseInt()
    Serial.parseInt(charskipChar)
    参数:skipChar用于在搜索中跳过指定字符(此用法未知)
    返回:返回下一个有效整型值。
    

    示例

    int comInt;
     
    voidsetup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
      if(Serial.available()>0){
          delay(100);
          comInt = Serial.parseInt();
          Serial.print("Serial.parseInt:");
          Serial.println(comInt);
        }
        // clear serial buffer
        while(Serial.read() >= 0){}
    }
    

    15.串口查找指定字符串
    Serial.find();(从串口缓存区读取数据,寻找目标字符串target(char型))

    语法

    char target[] = ”目标字符串”;
    
    Serial.find(target); 
    
    参数:
    target: 目标字符串(char型)
    返回:找到目标字符串返回真,否则为假
    

    示例

    char target[] ="test";
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
       if(Serial.available()>0){
          delay(100);
          if( Serial.find(target)){
             Serial.print("find traget:");
             Serial.println(target);       
            }
         }
        // clear serial buffer
        while(Serial.read() >= 0){}
    }
    

    16.Serial.findUntil(target,terminal); (从串口缓存区读取数据,寻找目标字符串target(char型数组),直到出现给定字符串terminal(char型),找到为真,否则为假。)
    语法

    Serial.findUntil(target,terminal); 
    参数
    target : 目标字符串(char型)
    terminal : 结束搜索字符串(char型)
    
    返回:如果在找到终止字符terminal之前找到目标字符target,返回真,否则返回假。
    

    示例

    char target[] ="test";
    char terminal[] ="end";
     
    void setup() {
      Serial.begin(9600);
      while(Serial.read()>= 0){}//clear serialbuffer
    }
     
    void loop() {
      // read data from serial port
       if(Serial.available()>0){
          delay(100);
          if( Serial.findUntil(target,terminal)){
             Serial.print("find traget:");
             Serial.println(target);
            }
         }
        // clear serial buffer
        while(Serial.read() >= 0){}
    }
    

    17.向串口写数据(串口输出数据函数。写二进制数据到串口。)
    Serial.write();
    语法

    Serial.write(val) 
    Serial.write(str) 
    Serial.write(buf, len)
    

    参数 :val: 字节
    str: 一串字节
    buf: 字节数组
    len: buf的长度

    返回 :字节长度

    示例

    void setup(){ 
    Serial.begin(9600); 
    }
    void loop(){ 
      Serial.write(45); // send a byte with thevalue 45 
      int bytesSent = Serial.write(“hello”); //sendthe string “hello” and return the length of the string. 
    }
    

    转载请注明:http://blog.csdn.net/iracer/article/details/50334041
    ————————————————
    版权声明:本文为CSDN博主「iracer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/iracer/article/details/50334041

    展开全文
  • Arduino-串口函数Serial

    2020-12-23 18:23:33
    串口是Arduino与其它设备进行通信的接口,我们需要很好的掌握它的使用。... //开启串行通信接口并设置通信波特率Serial.end();//关闭通信串口Serial.available();//判断串口缓冲器是否有数据装入Se...
  • open函数 read函数write函数
  • STM32串口发送函数printf()函数Usart_Printf()函数 注意:本文参考STM32F10XXX数据手册 printf()函数 printf函数是C自带库函数,用C都非常的熟悉,STM32编程大多也用C,那么其是否也能够用printf()函数? 答案是肯定...
  • 1. 问题及现象运用USART_SendData()函数非接连发送单个字符是没有问题的;当接连发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢呈现象。若发送的数据量很小时,此刻串口发送的仅仅最终一个字符,当发送...
  • setup函数,一般用于硬件相关的初始化,比如IO口、串口、wifi等 void setup() { } void loop() { } anrduino代码没错误,但是编译不过的解决办法: 1、安装路径不能有中文 2、安装路径不能有空格 3、不能放在...
  • 在dsp串口驱动输出上实现类似于printf函数的可变参打印输出效果。串口驱动代码自行根据使用DSP处理器编写,本文不实现串口驱动和初始化。只实现变参输入转换过程函数。 1、串口可变参打印输出实现具体代码如下如下:...
  • 串行端口用于Arduino和个人电脑或其他设备进行...你也可以通过Arduino开发环境软件中的串口监视器来与Arduino 控制器进行串口通信,你只需要点击Arduino IDE软件中的“串口监视器”按钮就可以打开串口监视器。 availa
  • Arduino 利用readString函数串口数据进行接收和打印 函数说明 readString() 函数可用于从设备接收到数据中读取数据信息。读取到的信息将以字符串格式返回。 本函数属于Stream类。该函数可被Stream类的子类所...
  • HAL常用函数详解

    2021-12-04 13:30:35
    HAL常用函数详解 HAL_GPIO.h HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);//初始化引脚 HAL_GPIO_DeInit(GPIOA,GPIO_PIN_1);//初始化PA1引脚为复位状态 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,...
  • stm32 串口打印函数

    2021-03-08 10:13:49
    STM32 串口打印函数 #include <stdarg.h> #include "main.h" #include "string.h" #include "usart.h" #include "usart_printf.h" #define TXBUF_SIZE_MAX 100 //串口输出 void usart_printf(UART_...
  • 51单片机串口通信实操(中断函数) 详细参考单片机手册 SM0、SM1分别为0,1时为模式一,因为模式一最为常用 REN=1,为接收,REN=0,为不接收 当 SM0,SM1,SM2,REN,TB8,RB8,TI,RI分别为0 1 0 0 0 0 0时,给SCON赋值时要...
  •   在单片机中使用最多的通信接口基本就是串口了,说起串口就不得不提串口中最常用的一个函数就是打印函数printf()函数,在上位机上中这个函数直接从库函数中调用就可以了,那么在单片机中这个函数要怎么使用呢?...
  • 可以改成下面这样/* UART in mode Receiver -------------------------------------------------*/if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) &&(__HAL_UART_GET_IT_...
  • 串口API通信函数编程

    2021-05-14 15:47:07
    串口API通信函数编程16位串口应用程序中,使用的16位的WindowsAPI通信函数:①OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计)CloseComm()关闭串口;例:intidComDev;idComDev=OpenComm("COM1",1024,...
  • /* * 创建串口线程 * uart_recvbuf_and_process是串口线程中的处理函数,参数为ptr_uart_device * 处理函数必须是int ptr_fun (unsigned char *buf,unsigned int len);类型的函数 */ int create_uart_pthread...
  • MATLAB串口操作

    2021-07-24 17:51:09
    建立串口对象–使用serial创建函数对一个特定的串口创建对象(可能要配置一些属性,如波特率、数据位数等) 对设备进行连接–使用fopen函数来实现串口对象与设备的连接。 配置属性–使用set或者 . 符号来建立想要的...
  • 1,串口操作需要的头文件#include /* 标准输入输出定义 */#include /* 标准函数库定义 */#include /* Unix 标准函数定义 */#include #include #include /* 文件控制定义 */#include /*终端控制定义 */#...
  • 参考教程:野火 以串口1为例,在利用串口进行接受数据时,我们要对STM32进行串口的中断配置。 先对进行宏定义(起个别名),方便移植: #define DEBUG_USART_IRQ USART1_...以下是中断函数(有每一步操作的详细备.
  • stm32f103串口printf,scanf函数串口重定向stm32f103串口printf,scanf函数串口重定向串口重定向的步骤:首先配置USART串口(初始化这些)重定向函数首先配置USART串口(初始化这些)先看代码uart.c中#include #include ...
  • 在单机开发中经常使用串口调试或者收集实时各种数据类型不同的数据少不了使用printf()函数重定向,但是对于资源紧缺的单片机使用printf(),性能不佳。为了以后工作方便,把几个常用的打印函数记录下来。 非递归实现...
  • 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...
  • 来源:河北工业大学 作者:葛磊蛟,毛一之,李歧,高婧嫱前言串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USE口的日趋流行,RS232接口串口...
  • 一、实现print函数 改写 fputc() 函数既可 #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机...
  • 描述0前言串行通信在通讯领域被广泛应用,标准的RS232接口已成为计算机、外设、交换机和许多通讯设备的标准接口。虽然近年来随着USB口的日趋流行,RS232接口串口作为一种传统的串口通信口有被取代的趋势。然而由于它...
  • stm32,Usart串口,修复串口开头丢失问题,修复串口与TIM时钟冲突问题

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 164,162
精华内容 65,664
关键字:

串口函数