单片机字符和字符串_单片机中用串口发送一串字符然后返回这一串字符 - CSDN
  • 关于printf的知识很零碎,感觉成体系的总结有点麻烦,这里就... printf函数可以方便的选择输出的内容,包括字符串,甚至是汉字形式的字符串; 当使用printf函数输出字符串的时候,肯定是一个字节一个字节的输出,而f

    关于printf的知识很零碎,感觉成体系的总结有点麻烦,这里就用列出的方法。

    1. printf 与 fputc、putchar…的关系

      无论是51还是ARM,都可以在标准输入输出头文件“iostd.h”中找到printf函数;

      printf函数可以方便的选择输出的内容,包括字符串,甚至是汉字形式的字符串;

      当使用printf函数输出字符串的时候,肯定是一个字节一个字节的输出,而fputc和putchar是printf的子函数,就是用来输出一个字节的;

      fputc是STM32里面的,putchar是51里面的,他们都是printf的子函数;

      在vc中,使用printf默认输出到当前输出设备——一般是显示屏;
      在单片机里面,可以通过更改putchar函数或fputc函数,自己设定printf输出的方向。

    2. 通过串口实现高级打印函数printf

      很简单,在单片机里面,只需要对putchar函数做出如下定义:

      这里写图片描述

      在STM32里面,需要对fputc函数做出如下定义:

      这里写图片描述

      很明显,以上工作都是有芯片库的支持,比如printf函数的搭建,定义printf和putchar函数的关系,把字符串变量转换为单个字节,识别%d,%f……等工作的完成。我们不需要关心这个,只要会调整printf函数的方向就好了。

      还有一个哥们,说用printf实现OLED屏幕的显示很方便;

      我们可以想一下这样的话,需要做什么条件:
      1.假如OLED显示屏是SPI或者I2C通信,要在fputc函数中换成响应写一个字节的函数;
      2.它的这个OLED屏要有相应的软件或硬件库,把接收到的字符串按照通信标准(ASCII或者其他)转化为字节;

    3. 自己写串口打印程序prints

      prints是自己写的函数,名字是随便取的;

      发送之前我们需要了解,当我们用printf发送字符串的时候,我们发送的实际是什么?

      英文字符串,发送的其实是ASCII编码对应的十进制序号;
      比如h在ASCII中对应序号为104,那就拿出一个字节,用来发送104;
      由于计算机常用16进制表示,所以在串口助手上会显示“68”;
      实际上,发送的既不是10进制,也不是16进制,而是104表示成8位的二进制代码,一串01而已;

      中文的话,会有另外一种编码机制(UCS2?),但这个不重要,我们只要在串口助手里面写上中文,点击16进制发送,就可以得到中文字节,每个中文占两个字节;
      其他和英文字符串没有区别;

      使用printf函数,发送的其实是表示字符串的一个个字节,字符串与字节的对应关系就是上面说的,是固定的。

      这里写图片描述

      每次发送字符串,发送的都是字符串的表示字节
      字符串和表示字节之间有转化规则,我们不用知道是什么规则,用指针发送就省去了这个规则——无论什么规则,转化成什么字节,我都可以通过指针寻址找到这些字节,并发送。

      比如,我写发送:
      prints(“hello world”);

      执行的是:
      这里写图片描述

      其中,“hello world”字符串,作为输入参数,说明字符串其实表示的这个字符串的首地址

      自己写的字符串打印程序,只能输出字符串,不能处理%d,%f等,不能随意设定输出的格式。

    展开全文
  • 实际有两个程序 一个是接收以某一特定字符开头的字符串 并不接收此特定字符 这个字符只起个标志的作用。 另一个是单纯接收字符串。 所接受的字符串存在一个数组中,程序简洁命了。 所用单片机:STC89C52
  • 51单片机串口接收字符串比较
  • STC15F104单片机模拟串口 接收 比较字符串
  • 最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。 其实发送字符串的本质还是发送一...

    最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。

    其实发送字符串的本质还是发送一个个字符,所以只需在字符串结束标志之前,循环发送字符即可。不罗嗦,上程序。

    //程序功能:利用串口发送一个字符串

    // 参数:USARTx USART编号 可取 USART1、USART2、USART3、USART4、 USART5(STM32F103ZET6)

    str 需要发送的字符串

    #include “stm32f10x.h”

    void Usart_SendString(USART_TypeDef* USARTx,char *str)

    {

    while(*str)

    {

    while(!USART_GetFlagStatus(USARTx,USART_FLAG_TXE)); //判断是否可以发送

    USART_SendData(USARTx,*str);

    while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)); //判断是否发送完成,此句必须有,否则会造

    //成只发送最后一个字符(覆盖)

    str++;

    }

    }

    方法二:
    const u8 TEXT_Buffer[]={“Explorer STM32F4 SPI TEST”};
    #define SIZE sizeof(TEXT_Buffer) ;

    for(i=0;i<SIZE;i++)
    {
    USART2->DR =TEXT_Buffer[i];
    delay_ms(10);
    }

    展开全文
  • 字符串转int atoi 函数原型int atoi(const char *nptr); int val = atoi("12"); 这样va就l等于12 int转字符串 itoa 函数原型:char*itoa(intvalue,char*string,intradix); int number=123456; char ...

    字符串转int atoi

    函数原型int atoi(const char *nptr);

    int val = atoi("12");
    这样va就l等于12

    int转字符串 itoa
    函数原型:char*itoa(intvalue,char*string,intradix);
    int number=123456;
    char string[25];
    itoa(number,string,10);
    string就是123456 后面的10是说转化成10进制 16就是转化成16进制 8就是转化成8进制 ,也可以转化成2进制

    字符串截取 strncpy
    原型:char*strncpy(char*dest,char*src,size_tnum);
    大家知道strcpy 是子环节复制字符串,可能不知道还有个strncpy,这是复制指定长度的字符串
    chardes[]="Hello,iam!";
    charsource[]="abcdefg";
    strncpy(chardes,charsource,3);
    这时chardes的值是abc 注意这里可不是把abc添加在!后面的,是从chardes这个数组的首地址开始赋值的,最后会加上'\0'做结束符。
    改变一下用法
    strncpy(chardes+1,charsource+2,3);
    这时候chardes的值是Hcde 为什么是这个值,能看懂不?自己思考一下。偏移哈。

    字符串构造 sprintf
    原型 int sprintf( char *buffer, const char *format, [ argument] … );
    这个应该很多人都知道。
    char dest[20];
    int val=12;
    sprintf(dest,"val=%d",val);

    dest的值就是"val=12" 那个12也是字符串了哈注意下。
    这个函数也可以整形、浮点型转字符串
    sprintf(dest,"%f",3.1415926f);
    dest 就是“3.1415926”

    sprintf(dest,"现在的时间是%s,请注意","2014-04-09 11:27:21"); 后面这个字符串也可以换成变量
    dest的值是 "现在的时间是2014-04-09 11:27:21,请注意"

    直接对内存操作memset
    原型 void *memset(void *s, int ch, size_t n);
    char buffer[20];
    strcpy(buffer,"1234567890");
    memset(buffer,0,sizeof(char)*20);
    这时buffer中的数据全都是0了

    strcpy(buffer,"1234567890");
    memset(buffer+2,6,sizeof(char)*2);
    这时buffer值是1266567890
    这个函数可以对任何数据类型的内存进行修改。所以有些从串口接收进来的数据需要做一下简单的修改再转发出去的话就可以用这个函数做修改。

    先介绍这些吧,再想起来别的再补充
    【2014-04-11 补】

    memcpy函数使用起来也不错的,直接把字节数组复制到指定位置了,这个就不说了。

    字符串分割strtok
    原型 char *strtok(char s[], const char *delim);
    分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。

    ARDUINO 代码

     
    输出:
    abc
    d

    记住了,只要第一次分割的时候需要指定字符串,之后再分割就用NULL就行了,当p==NULL的时候说明分割完了。这里使用到了指针,此处指针不需要释放。


    查找字符串 strstr
    原型 char *strstr(const char *str1, const char *str2);
    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
    str1: 被查找目标 
    str2: 要查找对象 

    char str[]="1234 xyz";
    char* str1=strstr(str,"34");
    printf("%s",str1);
    显示: 34 xyz

    字符串比较 strcmp
    原型:extern int strcmp(const char *s1,const char * s2);
    比较s1和s2 两个相等就返回0 不想等就返回非0值。

    字符串连接strcat
    原型 extern char *strcat(char *dest,char *src);
    把src 连接到dest值的后面,注意dest要有足够的空间去接收src否则会出错

     

    展开全文
  • 51单片机用到strcmp比较字符串问题及解决

    目前用单片机来比较两个字符串数组是否一样

     这样定义的字符串数组

     uchar rec_name[9]={0}; //串口接收到的密码数据 
    uchar code Passnum[9]={'1','7','0','5','1','9','0','0','1'}; // 设备自身固定密码

    if(strcmp((char*)rec_name,(char*)Passnum)==0)
    {
    SendString("connect ok\r\n");
    Pass_flag=0;
    }

    运行结果,向单片机串口发送170519001 字符串,这个比较函数愣是进不去,后来查找资料发现,定义字符串数组的最后一位必须要加上结束符'\0’,而以“170519001”这种形式存在的字符串自身编译器已经在末尾加上结束符‘\0’;所以立即修改定义的字符串数组后,终于可以正确运行了;

    uchar rec_name[10]={0};
    uchar code Passnum[10]={'1','7','0','5','1','9','0','0','1','\0'};

    展开全文
  • 在MSP430单片机的官方历程中有使用串口中断发送字符以及字符串的程序,但是移植性不高,我专门写了两个函数,用于...*程序描述:单片机的P3.4、P3.5作为串口发送字符和字符串 *作者 :Zhenhua Liu *时间 :2017.11.01
  • 关于printf的知识很零碎,感觉成体系的总结有点麻烦,这里就用列出的方法。 1、printf 与 fputc、putchar…的关系 ...当使用printf函数输出字符串的时候,肯定是一个字节一个字节的输出,而fputcp...
  • 主要解决51单片机串口通讯中的数据出错,或数据保存在SBUF中影响接下来的数据接收
  • 51单片机串口程序,字符串16进制发送与接收.docx
  • 工程是keil2. 简单的利用C51单片机,实现了printf函数输出字符串,数字等。 找了好多资料,然后自己总结了下,实现了printf函数的应用。 有了printf函数,你就可以像VC中一样实现输出了。
  • 转自:... #include //------------------串口通信协议-----------------// /* 客户端数据包格式解释(长度恒为15): 例如:A01_fmq_01Off___# A--------数据包的开始标记(可以为A到Z,意味
  • 单片机中由于资源有限,如果直接使用库函数中的sprintf函数实现浮点数转换成字符串,很可能会在链接时出现RAM资源不够的错误,在网上搜到一个比较好的方法,给大家共享。 unsigned char Float2Char(float ...
  • unsigned int str_to_num(char dig) /–字符串转化为数字–*/ { unsigned int num = 0; while(*dig != ‘\0’) { if(*dig >= ‘0’ && *dig <= ‘9’) { num = num * 10 + (*dig - ‘0’);//(*dig-48)...
  • 利用51单片机的串口通信,发送字符串 代码如下(模块函数): /*UART.C*/ #include "REG52.H" sfr AUXR = 0x8E; void UartInit(void) //9600bps@11.0592MHz { PCON &= 0x7F; //波特率不倍速 ...
  • 程序中用了很多strcat函数对字符串进行拷贝,我为了增强程序的通用性,就把原来字符串的地方用char数组代替。结果出现了很多意想不到的问题,输出字符混乱,系统重启等等。经过自己分析才发现strcat函数在作怪。C...
  • 51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收数据。 当串行发送完毕后,将在标志位 TI 置 1,同样,当收到了数据后,也会在 RI 置 1。 无论 RI 或 TI 出现了 1,只要串口中断处于开放状态,单片机...
  • 本程序将51单片机的按键与串口发送很好的联系在一起,众所周知,如果处理不好的话可能会一次按键后,单片机不停的重复发送,且程序中应用了很好的去抖动部分,本程序在郭天祥实验板上验证过,可放心使用。
1 2 3 4 5 ... 20
收藏数 15,704
精华内容 6,281
关键字:

单片机字符和字符串