精华内容
下载资源
问答
  • 最近接了个项目,需要用到单片机接收字符串,第一时间去百度查看相关代码,但是翻来翻去代码都是一样的,要么极度麻烦,要么不能用,于是自己写了一个相关代码工程,在这里写一下如何使用,并且提供源工程代码(无需...

    写在前面

    最近接了个项目,需要用到单片机接收字符串,第一时间去百度查看相关代码,但是翻来翻去代码都是一样的,要么极度麻烦,要么不能用,于是自己写了一个相关代码工程,在这里写一下如何使用,并且提供源工程代码(无需积分,关注我即可下载),点击这里去下载

    工程测试环境

    WIN10

    STC-ISP串口助手

    STC12C5A60S2单片机

    最小单片机系统套件

    晶振是11.0592MHz

    测试结果

    在双机通信情况下,每两次消息间隔最低为50ms,即可正常识别,测试结果如图(未丢失任何数据)。

    代码工程结构

    模块化程度极高,任何一个文件都可以拿出即用。

    写在最后

    希望大家转载注明出处。如果觉得可以的话,来一波关注吧哈哈哈哈。

    展开全文
  • 串口接收字符串程序

    2020-12-23 17:08:56
    /*****************************************************************************函数功能:单片机接收电脑串口发送的字符串,已验证正常,最大可接收100个字符最近一直在研究这个串口接收字符串问题,也看了网上很多...

    /*****************************************************************************

    函数功能:单片机接收电脑串口发送的字符串

    ,

    已验证正常

    ,

    最大可接收

    100

    个字符

    最近一直在研究这个串口接收字符串问题

    ,

    也看了网上很多例子都不能实现

    ,

    现在

    终于将此程序调试成功

    .

    设计者

    :

    空心菜

    联系

    qq:190719416

    修改时间

    2016/07/15

    下午

    15:22

    ****************************************************************************/

    #include

    #define uint unsigned int

    #define uchar unsigned char

    #define Fclk 11059200UL

    //

    晶体频率

    #define BitRate 9600UL

    //

    波特率

    uchar

    st[100];

    //

    保存串口数据的缓冲区数组

    ,

    如果想接收更多的字符可创建多

    个数组

    volatile uchar Sending;

    static uchar i=0;

    uchar flag;

    /****************************************************

    函数功能:串口初始化

    入口参数:无

    回:无

    注:无

    *****************************************************/

    void InitUART(void)

    {

    EA=0;

    //

    暂时关闭中断

    TMOD&=0x0F;

    //

    定时器

    1

    模式控制在高

    4

    TMOD=0x20;

    //

    定时器

    1

    工作在模式

    2

    ,自动重装模式

    ,

    定时器

    0

    工作在模式

    1,16

    位定时

    SCON=0x50;

    //

    串口工作在模式

    1

    TH1=256-Fclk/(BitRate*12*16);

    //

    给定时器装初值

    TL1=256-Fclk/(BitRate*12*16);

    PCON|=0x80;

    //

    串口波特率加倍

    ES=1;

    //

    串行中断允许

    TR1=1;

    //

    启动定时器

    1

    REN=1;

    //

    允许接收

    EA=1;

    //

    允许中断

    }

    /*****************************************************

    函数功能:串口中断处理

    入口参数:无

    回:无

    注:无

    展开全文
  • 】//--------------------------------------------------------------/*====================================*名称:lcd_str.c*功能:从串口调试工具发送一字符到单片机,在lcd1602和串口调试工具上显示【未加入...

    谢谢楼上这位兄台,我的问题解决了,贴上我的代码大家说说意见!【初学者,献丑了!!】

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

    /*====================================

    *名称:lcd_str.c

    *功能:从串口调试工具发送一字符串到单片机,在lcd1602和串口调试工具上显示【未加入校验】

    *作者:flying 09-2-23

    *修改:

    ======================================*/

    #include

    #define uchar unsigned char

    #define uint unsigned int

    sbit lcden = P3^5;

    sbit lcdrw = P3^6;

    sbit lcdrs = P3^7;

    uchar table[10];

    uchar i, j, flag;

    void delay(uint n)

    {

    uint x,y;

    for( x = n; x > 0; x--)

    for( y = 110; y > 0; y-- );

    }

    //lcd写命令函数

    void lcdwrite_com( uchar com )

    {

    lcdrs = 0;

    lcdrw = 0;

    P0 = com;

    delay(5);

    lcden = 1;

    delay(5);

    lcden = 0;

    }

    //lcd写数据

    void lcdwrite_date( uchar date )

    {

    lcdrs = 1;

    lcdrw = 0;

    P0 = date;

    delay(5);

    lcden = 1;

    delay(5);

    lcden  = 0;

    }

    //lcd初始化

    void lcd_init()

    {

    lcden = 0;

    lcdwrite_com( 0x38 );//显示模式设置

    lcdwrite_com( 0x0e );//显示光标

    lcdwrite_com( 0x01 );//清屏

    lcdwrite_com( 0x80 + 2 );//数据指针设置

    }

    //串口初始化

    void serial_init()

    {

    TMOD = 0x20;

    TH1 = 0xfd;         //9600赫兹

    TL1 = 0xfd;

    TR1 = 1;        //开启时间中断

    SCON = 0x50;//方式2

    SM2 = 1;        //可以向cpu请求中断

    EA = 1;                //开总中断

    ES = 1;                //开串口中断

    }

    void putchar( uchar ch )//发送数据

    {

    SBUF = ch;

    while( !TI );

    TI = 0;

    }

    void main()

    {

    lcd_init();

    serial_init();

    while(1)

    {

    delay(20);

    while( table[j] != '\0' && flag == 1 )

    {

    j = j >= 10 ? 0 : j;

    putchar( table[j] );

    lcdwrite_date( table[j] );

    j++;

    //                delay(10);

    }

    }

    }

    void Serial() interrupt 4

    {

    RI = 0;

    if( SBUF != '#')//遇到#终止写

    {

    table= SBUF;

    i++;

    }

    else

    flag = 1;

    }

    展开全文
  • GD32串口怎么接收字符串这个问题在之前困扰了我很长时间,可以通过轮询和中断两种方式,轮询主要代码如下: /*! \file main.c \brief USART printf demo */ /* Copyright (C) 2017 GigaDevice 2017-06-23, V...

    GD32串口怎么接收字符串这个问题在之前困扰了我很长时间,可以通过轮询和中断两种方式,中断方式接收字符串目前还不知道怎么实现,轮询主要代码如下:

    /*!
        \file  main.c
        \brief USART printf demo
    */
    
    /*
        Copyright (C) 2017 GigaDevice
    
        2017-06-23, V1.0.0, demo for GD32F30x
    */
    
    #include "gd32f30x.h"
    #include "gd32f303c_eval.h"
    #include "systick.h"
    #include <stdio.h>
    #include "gd32f30x_it.h"
    #include "string.h"
    
    uint16_t i;
    float adc_value[16];
    float vref_value[16];
    uint16_t j;
    void led_init(void);
    void led_flash(int times);
    void rcu_config(void);
    void gpio_config(void);
    void adc_config();
    uint16_t adc_channel_sample(uint8_t channel);
    unsigned char recv_cont=0;
    unsigned char recvdata[5]={0};
    		//	unsigned char i=0;
    
    /*!
        \brief      main function
        \param[in]  none
        \param[out] none
        \retval     none
    */
    
    int main(void)
    {
        /* initialize the LEDs */
        led_init();
        /* configure systick */
        systick_config();       //系统滴答定时器配置 
        
        /* flash the LEDs for 1 time */
        led_flash(1);
        
        /* configure EVAL_COM1 */
        gd_eval_com_init(EVAL_COM1); 
    
       rcu_config();
    	 
    	  gpio_config();
    	
    	  adc_config();
        /* configure WAKEUP key */
        gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
        
        /* output a message on hyperterminal using printf function */
        printf("\r\n USART receive example: please transmit a number \r\n");
        
        /* wait for completion of USART transmission */
    		    adc_value[0]=adc_channel_sample(ADC_CHANNEL_0);
    			  adc_value[1]=adc_channel_sample(ADC_CHANNEL_1);
            adc_value[2]=adc_channel_sample(ADC_CHANNEL_2);
            adc_value[3]=adc_channel_sample(ADC_CHANNEL_3);
            adc_value[4]=adc_channel_sample(ADC_CHANNEL_4);
    			  adc_value[5]=adc_channel_sample(ADC_CHANNEL_5);
    			  adc_value[6]=adc_channel_sample(ADC_CHANNEL_6);
    			  adc_value[7]=adc_channel_sample(ADC_CHANNEL_7);
    			  adc_value[8]=adc_channel_sample(ADC_CHANNEL_8);
    			  adc_value[9]=adc_channel_sample(ADC_CHANNEL_9);
    			  adc_value[10]=adc_channel_sample(ADC_CHANNEL_10);
    			  adc_value[11]=adc_channel_sample(ADC_CHANNEL_11);
    			  adc_value[12]=adc_channel_sample(ADC_CHANNEL_12);
    			  adc_value[13]=adc_channel_sample(ADC_CHANNEL_13);
    			  adc_value[14]=adc_channel_sample(ADC_CHANNEL_14);
    			  adc_value[15]=adc_channel_sample(ADC_CHANNEL_15);
    		while(1){
    	
    					for ( i =0;i<16;i++) {
    			    vref_value[i]=adc_value[i]*3.3/4096;
    					}
    					//printf("请输入一个数\r\n");
    					//scanf("%d\r\n",&j);
    		   if(usart_flag_get(USART0,USART_FLAG_RBNE)==1)
    		   {  
    			 
    			for(i=0;i<5;i++)
    			{
    				while(usart_flag_get(USART0,USART_FLAG_RBNE)==0);//等待接收
    				recvdata[i]=usart_data_receive(USART0);//读取数据到数组
    			}
    	
    			if(recvdata[0]=='A'&&recvdata[1]=='D'&&recvdata[2]=='C')
    			{  
    				switch((recvdata[3]-'0'))
    				{
    					case 0://0通道
    					//ADC采集相应通道
    					printf("ADC通道0的值是%5.3f\r\n",vref_value[0]);
    					break;
    					case 1://1通道
    					//ADC采集相应通道
    					printf("ADC通道1的值是%5.3f\r\n",vref_value[1]);
    					break;
    					//2通道
    					//ADC采集相应通道
    					case 2:
    						//
    					printf("ADC通道2的值是%5.3f\r\n",vref_value[2]);
    					break;
    					case 3:
    					printf("ADC通道3的值是%5.3f\r\n",vref_value[3]);
    					break;
              case 4:
    					printf("ADC通道4的值是%5.3f\r\n",vref_value[4]);
    					break;
              case 5:
    					printf("ADC通道5的值是%5.3f\r\n",vref_value[5]);
    					break;
              case 6:
    					printf("ADC通道6的值是%5.3f\r\n",vref_value[6]);
    					break;	
              case 7:
    					printf("ADC通道7的值是%5.3f\r\n",vref_value[7]);
    					break;
              case 8:
    					printf("ADC通道8的值是%5.3f\r\n",vref_value[8]);
    					break;	
              case 9:
    					printf("ADC通道9的值是%5.3f\r\n",vref_value[9]);
    					break;	
    				}
    			}
    			
    		
    	}	
    }
    		}
    void rcu_config(void)
    {
        /* enable GPIOA clock */
        rcu_periph_clock_enable(RCU_GPIOA);
    	  rcu_periph_clock_enable(RCU_GPIOB);
    	  rcu_periph_clock_enable(RCU_GPIOC);
        /* enable ADC clock */
        rcu_periph_clock_enable(RCU_ADC0);
        /* config ADC clock */
        rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);
    }
    
    void gpio_config(void)
    {
        /* config the GPIO as analog mode */
    	  gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
        gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
        gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
        gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
        gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_4);
    	  gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_5);
    	  gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_6);
    	  gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_7);
    	  gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
    	  gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
    	  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);
    	  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);
    	  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);
        gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_3);
    	  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_4);
    	  gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_5);
    	  
    	  
    }
    void adc_config(void)
    {
        /* ADC mode config */
        adc_mode_config(ADC_MODE_FREE);
        /* ADC data alignment config */
        adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
        /* ADC channel length config */
        adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1U);
        
        /* ADC trigger config */
        adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE); 
        /* ADC external trigger config */
        adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
    
        /* enable ADC interface */
        adc_enable(ADC0);
        delay_1ms(1U);
        /* ADC calibration and reset calibration */
        adc_calibration_enable(ADC0);
    }
    uint16_t adc_channel_sample(uint8_t channel)
    {
        /* ADC regular channel config */
        adc_regular_channel_config(ADC0, 0U, channel, ADC_SAMPLETIME_7POINT5);      //adc规则通道配置
        /* ADC software trigger enable */
        adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);                     //adc软件触发使能
    
        /* wait the end of conversion flag */
        while(!adc_flag_get(ADC0, ADC_FLAG_EOC));                              //等待转换完成标志
        /* clear the end of conversion flag */
        adc_flag_clear(ADC0, ADC_FLAG_EOC);                                     //清除转换完成标志
        /* return regular channel sample value */
        return (adc_regular_data_read(ADC0));                                    //返回规则通道样品值
    }
    /*!
        \brief      initialize the LEDs
        \param[in]  none
        \param[out] none
        \retval     none
    */
    void led_init(void)
    {
        gd_eval_led_init(LED2);
        gd_eval_led_init(LED3);
        gd_eval_led_init(LED4);
        gd_eval_led_init(LED5);
    }
    
    /*!
        \brief      flash the LEDs for test
        \param[in]  times: times to flash the LEDs
        \param[out] none
        \retval     none
    */
    void led_flash(int times)
    {
        int i;
        for(i=0; i<times; i++){
            /* delay 400 ms */
            delay_1ms(400);
    
            /* turn on LEDs */
            gd_eval_led_on(LED2);
            gd_eval_led_on(LED3);
            gd_eval_led_on(LED4);
            gd_eval_led_on(LED5);
    
            /* delay 400 ms */
            delay_1ms(400);
            /* turn off LEDs */
            gd_eval_led_off(LED2);
            gd_eval_led_off(LED3);
            gd_eval_led_off(LED4);
            gd_eval_led_off(LED5);
        }
    }
    
    /* retarget the C library printf function to the USART */
    int fputc(int ch, FILE *f)
    {
        usart_data_transmit(EVAL_COM1, (uint8_t)ch);
        while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE));
        return ch;
    }
    
    
    展开全文
  • 【STM32】串口接收任意字符串

    千次阅读 2021-11-16 17:55:52
    之前写了一篇STM32hal库串口中断接收任意字符 实际上是不完美的,他接收到换行符就完蛋了。 花了点时间深入研究了一下hal库的串口中断函数,发现他其实是不完美的,有一些BUG。 所以查了资料,找了很久,才找到这个...
  • /** 单片机接收主机的数据,然后将数据传送到P1口, 并传回给主机; ** 当按下K1=P1.4 时, 单片机发送字符串 给主机 * ** ...
  • STM32串口接收特定字符串并控制LED

    千次阅读 2021-04-21 09:51:08
    本文使用的是STM32F103 其实串口通信控制LED非常简单,只需要把两个例程中的一部分内容无脑复制就可以了。
  • //全局变量,最终收到的字符串放入 char USART2_IT_string_buf[400]; //全局变量,接收字符串的缓存 void USART2_IRQHandler(void){//接收字符串的中断处理函数 //u8 char_buf;//改为了全局变量 if(SET == USART_...
  • STM32F407串口接收并解码字符串

    千次阅读 2020-12-23 19:03:29
    STM32F407串口接收并解码字符串 usart2.c 串口2初始化 //初始化串口2 //bound:波特率 void uart2_init(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_...
  • //串口接收程序,P0口显示接收数据, 11.0592MHz,波特率9600bps;//调试通过;#include void serial_port_initial()//{PCON=0x00; //波特率bu加倍SCON=0x50;//0101,00008位可变波特率,无奇偶校验位TMOD=0x20;//...
  • STM32串口输出字符串

    千次阅读 2021-08-21 14:50:38
    由于采用异步通信,所以通信双方(这里是 上位机 与 STM32)必须提前说明好 字符格式(一帧中的字符格式) 和 通信速率(波特率) 步骤 1、确定 IO 口并初始化 数据进入 USB 端口之后会进入 CH340
  • uart.c #include <reg52.h> #include "uart.h" #define uint unsigned int #define uchar unsigned char ...//串口初始化函数 9600 void URATinit() { TMOD=0x20; SCON=0x50; TR1=1; TH1=0xfd; TL1=
  • 1 #include23 //------------------串口通信协议-----------------//4 /*5 客户端数据包格式解释(长度恒为15):6 例如:A01_fmq_01Off___#7 A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种)8 01-----...
  • 1、首先用sprintf格式化字符串,可以把需要打印的变量的值也放进去。然后用模拟串口发送。 2、例如: void gnss_app_output_nmea(char *nmea_buffer){ int32_t checksum = 0; char temp_buffer[MNL_SERVICE_MAX_...
  • 串口接收数据能不能以字符串结束符来标识字符串接收完成,我弄了好久没弄出来,哪位大神指点一下#include "stm32f10x.h"#include "usart1.h"#include "led.h"#include "delay.h"void my_USART1_Init(u32 bound){GPIO...
  • python串口接收数据

    2021-03-17 02:44:28
    python3.5 读取口中的数据怎么解码数据: b'\x0e\xbeUS\xf8]m\xf6\x97Z\n'采用默认通信参数 import serial t = serial.Serial('com1',9600) n = t.write('you are my world')print t.portstrprint n str = t.read...
  • 本文介绍串口中断接收不定长字符串的方法。将串口1配置接收中断使能、空闲中断使能来接收不定长数据。 也就是在配置串口中断的时候使能接收中断和空闲中断。如下: ... USART_ITConfig(USART1, USART_IT_RXNE, ...
  • 51单片机串口接收发送固定大小字符串程序 #include <REG52.H> #include <string.h> #include <stdio.h> sbit led=P2^7; unsigned char UARTbuff[32]; int k=0; static unsigned char count=0; ...
  • 本文介绍串口中断接收不定长字符串的方法。采用定时中断给串口2的接收提供定时,再一次中断内(1ms)接收数据的长度不变则认为接收完成。 board_uart.h /**=======================================================...
  • STM32——串口发送字符、字符串 + printf 的重定向基本框架1. 配置时钟:配置GPIO时钟、窗口时钟、引脚复用时钟2. 配置GPIO结构体在 stm32f10x_gpio.h 头文件中查找相关函数函数3. 配置串口结构体在 stm32f10x_usart...
  • 通常情况下串口通信用的大多数都是用十六进制数据来传输指令,比如最常见的modbus的通信,如读保持寄存器指令:01 03 00 00 00 01 84 0A,这种十六进制的指令在这里就不讨论了。想要详细了解可以看往期的文章。串口...
  • 本贴是根据一博主改写的代码,如有侵权请联系删除.QQ:1132851305,...对串口通信协议有了基础的了解写代码就好办了,发送函数是很简单的,只需要根据通信协议,在字符bit位为1的时候拉高引脚,bit位为0的时候将引脚
  • 功能如题目。在串口收到逗号分割的6串数字比如100,200,45,4,87,99...//定义一个comdata字符串变量,赋初值为空值String comdata = "";//numdata是分拆之后的数字数组int numdata[6] = {0}, PWMPin[6] = {3, 5, 6, 9...
  • 原标题:51单片机串口向计算机发送字符串C程序向计算机 C程序,本布衣实验过的,可以用,串口需有一个232-TTL电平转换通过 助手可以看到发送字符信息。波特率为9600#include #include //---------------------------...
  • 串口发送数据一般会分为16进制格式发送和字符串格式下发,两种格式下发需要对数据进行不同的处理才能正确下发 # 通过串口下发16进制 if self.lineEdit.text() != "": list_use = [] num = self.lineEdit.text()....
  • 配置串口通信模式时设置成了同步模式,改成异步模式就好了 有些串口调试助手(如win10商店的免费的串口调试助手)不能正确显示接收的字符,需要换调试软件。
  • 问题需求: 向电机发指令s r0x2f 1666666用以设置电机的转速为1000。 s r0x2f 1666666 设置速度为 1000RPM 问题jie
  • 串口发送字节、半字、字、字符串、数组及实现串口控制简介串口的配置1. 配置usart的TX和RX引脚2. 配置串口模式3.配置串口的优先级(使用串口中断时)4.串口初始化编写发送函数发送一个字节函数发送半字函数发送字...
  • 用C#自制串口助手的发送栏接收的字符串转化为16进制的可用方法 目的: 用c#自己制作一个串口助手,在发送框内可以发送普通的字符串,也可以发送字符串形式的16进制数。对于此过程的字符串转化为16进制数研究了一段...
  • 最近一直研究硬件,经常和各种开发板或单片机打交道,需要通过串口或者Tcp/Udp来发送和接收数据。Unity提供了一个SerialPort库可以进行串口通讯,但是在使用过程中发现会丢包或者粘包,令人头秃。 最近找到一位...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,925
精华内容 15,170
关键字:

串口收字符串