精华内容
下载资源
问答
  • 串口发送数据包,不丢包
  • 想要通过串口发送信息给单片机. 例如给1号单片机发送233这个数据,发送格式为:编号+数据位数+数据(1#3233)告知1号单片机接收的数据共3位,单片机向后读取3三位为233...
  • Usart 串口发送数据包 两种方式(结构体,指针数组) 1.结构体指针 1.1 结构体和联合体 /* 叙述:这种直观性比较,利用联合体和结构体的形式组成数据包,通过结构体指针发送 */ typedef union{ struct { ...

    Usart 串口发送数据包 两种方式(结构体,指针数组)

    1.结构体指针

    1.1 结构体和联合体

    /*
    	叙述:这种直观性比较,利用联合体和结构体的形式组成数据包,通过结构体指针发送
    */
    typedef union{
    	struct
    	{
    		unsigned char id;
    		unsigned char addr;
    		unsigned char head; 
    		unsigned char left_time; 		
    		unsigned char left_hour; 				
    		unsigned char right_time; 		
    		unsigned char right_hour; 						 
    		unsigned char key_high; 						  
    		unsigned char key_low; 						  	 
    		unsigned char sofa_left; 						  
    		unsigned char sofa_right; 						  	 
    		unsigned char funtion_dis; 						  	 
    		unsigned char checksum;
    		unsigned char stop;
    	}led_sta;
    	unsigned char tx_buf[BUF_SIZE];
    }
    DATA_FORMAT_TX;
    
    void   send_buf(DATA_FORMAT_TX *buf) {
    	unsigned char i;	
    	for(i =  0 ; i <14;i++ ){
    			printf("%c", buf->tx_buf[i]); 			
    	}			
    }
    
    void send_buf_packet(void){	
    	DATA_FORMAT_TX buf;
    	buf.led_sta.id 	   			=0x05;
    	buf.led_sta.addr  			=0x03 ;
    	buf.led_sta.head  			=0xE1 ; 
    	buf.led_sta.left_time 		= 0 ; 		
    	buf.led_sta.left_hour 		= 1 ; 				
    	buf.led_sta.right_time 		= 2 ; 		
    	buf.led_sta.right_hour 		= 3 ; 						 
    	buf.led_sta.key_high 	 	= 4 ; 						 
    	buf.led_sta.key_low    		= 5 ; 						 
    	buf.led_sta.sofa_left		= 6 ; 						 
    	buf.led_sta.sofa_right 		= 7 ; 						 
    	buf.led_sta.funtion_dis		= 8 ; 						 
    	buf.led_sta.checksum		= 0XAA;
    	buf.led_sta.stop 			= 0XFB;		
    	send_buf(&buf);
    }
    

    1.2 纯结构发送的形式

    /*
    	叙述:这种跟前面一种较为相似, 直接操作结构体
    */
    
    void send_buf_packet(void) {
    	DATA_FORMAT_TX  send_dat,*p  = &send_dat ;  // 定义一个结构,把地址传给指针
    	unsigned char *pstu,i,len;
    	p->id 	   				= 0x05;
    	p->addr  				= 0x03 ;
    	p->head  				= 0xE1 ; 
    	p->left_time 			= 0 ; 		
    	p->left_hour 			= 1 ; 				
    	p->right_time 			= 2 ; 		
    	p->right_hour 			= 3 ; 						 
    	p->key_high 	 		= 4 ; 						 
    	p->key_low    			= 5 ; 						 
    	p->sofa_left			= 6 ; 						 
    	p->sofa_right 			= 7 ; 						 
    	p->funtion_dis			= 8 ; 						 
    	p->checksum				= 0XAA;
    	p->stop 				= 0XFB;
    	pstu = (unsigned char *)&send_dat;  // 强制转换地址,前提结构一种类型(unsigned char)
    	len = sizeof(send_dat);   		   //  计算结构体的长度
    	for(i =  0 ; i <len;i++ ){		  
    			printf("%c",*pstu++);     // 输出遍历结构元素
    	}
    }
    

    2.指针数组形式

    /*
    	这种比较简单暴力直观明了,利用指针数组的形式传递数据
    */
    
    void  send_buf_packet(void)
    {
    	unsigned char *p, arr[10] = {0,1,2,3,4,5,6,7,8,9};
    	for(p = &arr[0]; p < &arr[10];){   //把地址的位置值取出来				
    		printf("%c",*p); 			 //打印数据
    		*p++;						//指向地址
    	}	
    }
    
    展开全文
  • 串口发送函数: 串口打印结果: 可以看到,明明TxBuff的大小为10个字节,但是只输出了后9位数据,第一位0x31没有输出; 更改代码如下: 串口打印结果如下: 可以看到TxBuff[0]被正常输出了。 查询STM32F4xx参考...

    设定发送数据如下:
    要发送的数据
    串口发送函数:
    发送数据
    串口打印结果:
    串口打印结果
    可以看到,明明TxBuff的大小为10个字节,但是只输出了后9位数据,第一位0x31没有输出;

    更改代码如下:
    新添加清空TC标志位
    串口打印结果如下:
    第二次串口打印结果
    可以看到TxBuff[0]被正常输出了。
    查询STM32F4xx参考手册关于TC标志位有这样一段话,
    在这里插入图片描述
    里面提到TC标志位是由软件序列清零的,也就是执行一条读状态寄存器SR,然后在写入数据寄存器DR来实现的发送完成标志位清零,也就是我们代码中

    for( len = 0;len < (sizeof(TxBuff));len++)
    	{
    		USART_SendData(USART1,TxBuff[len]);
    		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
    	}
    

    1.执行USART_GetFlagStatus(USART1,USART_FLAG_TC);就相当于读取USART_SR寄存器;
    2.执行USART_SendData(USART1,TxBuff[len]);就相当于向数据寄存器USART_DR写入数据;
    所以上述代码相当于每次从第二个数据开始才实现的TC清零序列,由此可以看出第一个数据TxBuff[0]加载到数据寄存器USART_DR后随机执行while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);如果USART_SR->TC一开始就是置1的状态,就会随即执行USART_SendData(USART1,TxBuff[1]);将数据TxBuff[1]写入USART_DR寄存器取代了之前数据寄存器中TxBuff[0]的值,并实现了一个TC软件清零序列,等待发送TxBuff[1]后,TC置1,后面依次发送TxBuff[2],TxBuff[3]…

    问题就出现在这里,在发送第一个数据之前加入一条USART_ClearFlag(USART1,USART_FLAG_TC);软件清零TC的指令之后实现了串口打印输出的正常,查看USART_SR寄存器可以发现TC位的复位值为1,从而导致串口发送的第一个数据被第二个数据覆盖。
    USART_SR寄存器

    展开全文
  • 串口发送数据包,解码后: 1.改变PB5和PB6的PWM频率和占空比 2.使PA0输入捕获方波 3.相关信息返回串口 基于正点原子的stm32f103zet6 1.时钟配置: 2.TIM配置: TIM3ch2负责PB5,这里没画,但是一定要记得中断使能...

    stm32cubemx,简易通信协议.

    用串口发送数据包,解码后:
    1.改变PB5和PB6的PWM频率和占空比
    2.使PA0输入捕获方波
    3.相关信息返回串口

    基于正点原子的stm32f103zet6
    1.时钟配置:
    在这里插入图片描述
    在这里插入图片描述
    2.TIM配置:
    TIM3ch2负责PB5,这里没画,但是一定要记得中断使能哦
    在这里插入图片描述
    TIM4ch1负责PB6,这里没画,但是一定要记得中断使能哦
    在这里插入图片描述
    TIM5用来输入捕获,这里没画,但是一定要记得中断使能哦在这里插入图片描述
    USART1
    在这里插入图片描述
    时钟树配置
    在这里插入图片描述
    提示:

    • TIM中的auto-reload不管你是disable还是enable都无所谓
    • 你发现我的TIM3和TIM4的prescale是0,我打算占空比这种东西配置又串口发送的数据包来配置。

    工程配置

    /* Private includes ----------------------------------------------------------*/
    /* USER CODE BEGIN Includes */
    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    #include "stdbool.h"
    /* USER CODE END Includes */
    
    /* Private define ------------------------------------------------------------*/
    /* USER CODE BEGIN PD */
    #define LED1_ON()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);
    #define LED1_OFF()    HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
    #define LED1_TOG()	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
    #define LED2_ON()     HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);
    #define LED2_OFF()    HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);
    #define LED2_TOG()	  HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
    /* USER CODE END PD */
    
    /* USER CODE BEGIN PV */
    /*********01以下为调制PWM所需变量**************/
    uint8_t str1[]			="hello world\r\n";
    uint8_t str2[]			="error data\r\n";
    uint8_t Rx_data[1];		//串口接受到的数据
    uint8_t buff[64]		="0x00";//串口准备发送数据的存放地点
    int Duty				=200;
    int Step				=0;
    int flag				=0;
    bool get_Flag2_Times	=0;
    bool get_Flag3_Times	=0;
    /*********02以下为输入捕获所需变量**************/
    uint16_t capture_Buf[3] ={0};  	//存放计数值
    uint8_t capture_Cnt 	=0;    	//状态标志位
    uint32_t overload_Cnt 	=0;		//溢出次数
    uint16_t high_time		=0;   	//高电平捕获计数
    uint16_t low_time		=0;		//低电平捕获计数
    double HL_time			=0;		//高电平时间
    double LL_time			=0;		//低电平时间
    double fre				=0;		//频率
    double duty				=0;		//占空比
    /*************重写fputc函数*********************/
    int fputc(int c, FILE *stream) 
    {
        HAL_UART_Transmit(&huart1, (unsigned char *)&c, 1, 1000);   
        return 1;
    }
    
    /* USER CODE END PV */
    
    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    
    /************用户初始化相应的时钟配置****************/
    void User_Init()
    {
      
      HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//PWM定时器3启动
      HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);//PWM定时器4启动
      HAL_UART_Receive_IT(&huart1,Rx_data,1); //串口准备接收中断
      __HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//定时器5设置为上升沿捕获  
      HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1); 	//定时器5启动
    //HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);	//输入捕获定时器
    //HAL_TIM_Base_Start_IT(&htim4);				//普通定时器4
    }
    void getHelp()
    {
    	printf("/************************************************/\r\n");
    	printf("欢迎使用stm32通信协议实验\r\n");
    	printf("串口输入数据包进行你想要的操作\r\n");
    	printf("数据包格式为FF FF CB 0x X1 X2 X3 X4....FF\r\n");
    	printf("其中FF FF为包头,FF为包尾\r\n");
    	printf("CB表示上位机向下位机发送数据\r\n");
    	printf("0x为操作码,其中01调制占空比,02调制周期,03捕获方波\r\n");
    	printf("默认方波输出GPIO为PB5和PE5,方波捕获GPIO为PA0\r\n");
    	printf("0x为01时,X1,X2控制PB5输出高电平时长的低8位和高8位\r\n");
    	printf("X3,X4控制PE5输出高电平时长的低8位和高8位\r\n");
    	printf("0x为02时,X1,X2控制PB5输出周期时长的低8位和高8位\r\n");
    	printf("X3,X4控制PE5输出周期时长的低8位和高8位\r\n");
    	printf("单位是us\r\n");
    	printf("0x为03时,无视Xi的取值,PA0读取方波\r\n");
    	printf("/************************************************/\r\n");
    	printf("初始时,设置PB5,PE5周期为20ms\r\n");
    	printf("示例:\"FF FF CB 01 D0 07 F4 01 FF\"设置PB5,PE5高电平为2ms,0.5ms\r\n");
    	printf("示例:\"FF FF CB 02 20 4E 20 4E FF\"设置PB5,PE5周期为20ms\r\n");	 
    	printf("示例:\"FF FF CB 03 FF\"输出PA0捕获到的方波\r\n");	
    	printf("/************************************************/\r\n");
    }
    
    /*通过data[0]来改变PWM最大占空比的周期(不得大于200即C8)
      此函数用于早期调试,本例程并没有用到*/
    void PWM_Breathe_LED1(uint8_t *Rx_data)
    {
    	  //Duty指的是高电平的时间,而高电平时灯是灭的。Duty=0时,灯最亮
    	  for(Duty=Rx_data[0];Duty>=0;Duty--)
    	  {
    		 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Duty);
    		 HAL_Delay(1);
    	  }
    	  
    	  for(Duty=0;Duty<=Rx_data[0];Duty++)
    	  {
    		 __HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Duty);
    		HAL_Delay(1);
    	  }
    }
    /*此函数用于调制PB5的占空比
      其中*Rx_data代表第八位,*(Rx_data+1)代表高八位*/
    void PWM_SG90_1(uint8_t *Rx_data)
    {
    	Duty=*(Rx_data) + 256 * (*(Rx_data+1));
    	
    	//下面这里用printf更好,但是这个函数是早期写的,不太想改
    		uint8_t temp[64]="\0";
    		sprintf((char*)temp,"PB5的数值是:%d, 占空比为:%.2f/%.2fms\r\n",Duty,Duty/1000.0,(htim3.Init.Period+1)/1000.0);//Duty的数值是:
    		HAL_UART_Transmit(&huart1,temp,sizeof(temp),10000);
    	//上面这里用printf更好,但是这个函数是早期写的,不太想改
    	
    	HAL_UART_Receive_IT(&huart1,Rx_data,1);
    	__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,Duty);
    }
    
    /*此函数用于调制PE5的占空比*/
    void PWM_SG90_2(uint8_t *Rx_data)
    {
    	Duty=*(Rx_data) + 256 * (*(Rx_data+1));	
    	//下面这里用printf更好,但是这个函数是早期写的,不太想改
    		uint8_t temp[64]="\0";
    		sprintf((char*)temp,"PE5的数值是:%d, 占空比为:%.2f/%.2fms\r\n",Duty,Duty/1000.0,(htim4.Init.Period+1)/1000.0);//Duty的数值是:
    		HAL_UART_Transmit(&huart1,temp,sizeof(temp),10000);
    	//上面这里用printf更好,但是这个函数是早期写的,不太想改
    	HAL_UART_Receive_IT(&huart1,Rx_data,1);
    	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,Duty);
    }
    
    /* USER CODE END 0 */
    
    
    int main(void)
    {
      /* USER CODE BEGIN 1 */
      Rx_data[0]=0xC8;//初始时,高电平时长最大值按照200来看
      /* USER CODE END 1 */
    
      /* MCU Configuration--------------------------------------------------------*/
    
      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
      HAL_Init();
    
      /* USER CODE BEGIN Init */
    
      /* USER CODE END Init */
    
      /* Configure the system clock */
      SystemClock_Config();
    
      /* USER CODE BEGIN SysInit */
    
      /* USER CODE END SysInit */
    
      /* Initialize all configured peripherals */
      MX_GPIO_Init();
      MX_TIM3_Init();
      MX_USART1_UART_Init();
      MX_TIM4_Init();
      MX_TIM5_Init();
      /* USER CODE BEGIN 2 */
      /************用户初始化相应的时钟配置****************/
      User_Init();
      printf("欢迎使用stm32通信协议实验\r\n");
      printf("输入\"FF FF CB 00 FF\"以获取帮助\r\n");
      /* USER CODE END 2 */
    
      /* Infinite loop */
      /* USER CODE BEGIN WHILE */
      while (1)
      {
        /* USER CODE END WHILE */
    	
      }
      /* USER CODE END 3 */
    }
    
    * USER CODE BEGIN 4 */
    
    /*
    获得数据包后,根据包头进行指令解码
    */
    void takeActions(uint8_t* low,uint8_t* high)
    {
    	//*low为CB表示上位机是向下位机发送指令,*high为01表示动作调试指令(调制高电平时间)
    	//一般来讲*low为buff[2],*high为buff[3]
    	if(*low == 0xCB && *high == 0x01)
    	{
    		//其中buff[4]为低8位buff[5]为高8位
    		if(buff[4]!=0x00)
    		{
    			PWM_SG90_1(&buff[4]);//buff[4]和buff[5]为输出占空比。
    		}
    		//其中buff[6]为低8位buff[7]为高8位
    		if(buff[6]!=0x00)
    		{
    			PWM_SG90_2(&buff[6]);//buff[6]和buff[7]为输出占空比。
    		}				
    	}
    	//low为CB表示上位机是向下位机发送指令,high为02表示动作调试指令(调试周期长短)
    	if(*low == 0xCB && *high == 0x02)
    	{
    		if(buff[4]!=0x00)
    		{
    			htim3.Init.Period=buff[4]+256*buff[5];
    			uint8_t temp[64]="\0";
    			sprintf((char*)temp,"PB5接收到的数据为%d,单个周期为%.4fms\r\n",htim3.Init.Period,(htim3.Init.Period+1)/1000.0);
    			HAL_UART_Transmit(&huart1,temp,sizeof(temp),10000);
    			HAL_UART_Receive_IT(&huart1,Rx_data,1);
    		}
    		if(buff[6]!=0x00)
    		{
    			htim4.Init.Period=buff[6]+256*buff[7];
    			uint8_t temp[64]="\0";
    			sprintf((char*)temp,"PE5接收到的数据为%d,单个周期为%.4fms\r\n",htim4.Init.Period,(htim4.Init.Period+1)/1000.0);
    			HAL_UART_Transmit(&huart1,temp,sizeof(temp),10000);
    			HAL_UART_Receive_IT(&huart1,Rx_data,1);
    		}				
    	}
    	//low为CB表示上位机是向下位机发送指令,high为03表示动作调试指令(PA0输入捕获检测周期长短)
    	if(*low == 0xCB && *high == 0x03)
    	{
    		printf("PA0捕获频率: %7.3lfhz,占空比:%4.1lf%%\r\n高电平时长:%7.3lfms,低电平时长:%7.3lfms\r\n周期:%7.3lfms\r\n\r\n",fre,duty,HL_time,LL_time,HL_time+LL_time);
    	}
    	if(*low == 0xCB && *high == 0x00)
    	{
    		getHelp();
    	}
    }
    //捕获计数器溢出 中断回调函数
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    	if(htim->Instance==TIM5)
    	{
    		overload_Cnt++;
    	}
    }
    //捕获计数器捕获到边沿 中断回调函数
    void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
    {
    	if(TIM5 == htim->Instance)
    	{
    		switch(capture_Cnt){
    			//初始化已经为上升沿检测,此时捕获到上升沿后,进入case 0
    			case 0:
    				capture_Buf[0]=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
    				__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获
    				capture_Cnt++;
    				overload_Cnt=0;//准备为溢出中断计数
    				break;
    			case 1:
    				capture_Buf[1]=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
    				__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);  //设置为上升沿捕获
    				capture_Cnt++;
    				break;
    			case 2:
    				capture_Buf[2]=HAL_TIM_ReadCapturedValue(&htim5,TIM_CHANNEL_1);//获取当前的捕获值.
    				HAL_TIM_IC_Stop_IT(&htim5,TIM_CHANNEL_1); //停止捕获
    				high_time=capture_Buf[1]-capture_Buf[0] + overload_Cnt*0xffff;
    				low_time=capture_Buf[2]-capture_Buf[1] + overload_Cnt*0xffff;
    				HL_time=high_time * 0.01 ;
    				LL_time=low_time * 0.01 ;
    				fre=1/(HL_time+LL_time) * 1000;
    				duty=HL_time/(HL_time+LL_time)*100;
    				capture_Cnt=0;//clear flag
    				overload_Cnt=0;//clear flag
    				__HAL_TIM_SET_CAPTUREPOLARITY(&htim5,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);  //设置为上升沿捕获
    				HAL_TIM_IC_Start_IT(&htim5,TIM_CHANNEL_1); //Start input capture
    				break;				
    		}	
    	}
    }
    
    //串口1中断回调
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
    	if(huart->Instance==USART1)
    	{
    		//HAL_UART_Transmit(&huart1,Rx_data,sizeof(Rx_data),10000);//发送我接受到的数据	
    		//先判断是否是包头包尾数据
    		if(Rx_data[0]==0xFF)
    		{
    			switch(flag)
    			{
    				case 0 ://如果是第一次接受到包头,flag置为1
    				{
    					flag=1;
    					break;
    				}
    				case 1 ://如果是第二次收到包头,flag置为2,重置buff内的数据,
    				{
    					flag=2;
    					memset(buff, 0, sizeof(buff)); 
    					buff[0]=0xFF;
    					buff[1]=0xFF;
    					Step=2;//为后续添加数据做准备
    					get_Flag2_Times=1;
    					break;
    				}
    				case 2: //如果是第三次次收到包尾,flag置为3
    				{
    					flag=3;
    					buff[Step]=0xFF;
    					get_Flag3_Times=1;
    					break;
    				}
    			}
    		}
    		
    		//第一次flag=2不能进入,第二次到flag=2可以进入
    		if(flag==2 && get_Flag2_Times!=1)
    		{
    			buff[Step]=Rx_data[0];	
    			Step++;		
    		}
    		//如果已经获得包尾标志,
    		if(flag==3 && get_Flag3_Times==1)//包尾数据如果是flag=3,数据接受完毕
    		{
    			flag=0;
    			//HAL_UART_Transmit(&huart1,buff,Step+1,10000);
    			takeActions(&buff[2],&buff[3]);
    		}
    	}
    	get_Flag2_Times=0;
    	get_Flag3_Times=0;
    	HAL_UART_Receive_IT(&huart1,Rx_data,1);//接受1个字节数据,改变Rx_data[0]的数值
    }
    //定时器4中断回调
    //void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    //{
    //	if(htim->Instance==TIM4)
    //	{
    //		//LED2_TOG();
    //	}
    //}
    /* USER CODE END 4 */
    

    展开全文
  • 上位机给下位机发送一个数据包,如果校验位正确...还有,上位机给下位机发送数据包,校验位错了就不会执行指令;[color=#FF0000]那下位机给上位机的回报数据包校验位错了会怎么样?[/color]指令都运行完了,会发生啊?
  • 通过C#实现串口通信,里面的代码展示了如何监听计算机中的串口,解析数据或者发送数据,做串口开发的可以参考
  • arm linux下实现串口进行数据包发送与接受,并进行解码提取数据,为程序源码
  • 通过RXTXcomm.jar控制串口接收和发送数据,本人自己写的包.
  • 在WINXP下的串口通讯数据包抓取程序

    热门讨论 2009-03-23 11:29:08
    串口收/发的数据抓取:在电脑与设备之间正常通讯时,用于抓取通讯软件发送数据包串口设备的回传的数据包
  • fpga串口多字节发送数据包发送

    千次阅读 2019-09-01 22:49:15
    最近主管让我用串口循环发送数据包,这对单片机来说很简单,但是用fpga来做对我来说就有点难了,在查了点资料后就开始写,然后基本就那样了。 首先是读入发送的数据: always@(posedge rst_n) $readmemh("E:\\...

    最近主管让我用串口循环发送数据包,这对单片机来说很简单,但是用fpga来做对我来说就有点难了,在查了点资料后就开始写,然后基本就那样了。

    首先是读入发送的数据:

    always@(posedge rst_n)
    	$readmemh("E:\\ModelsimWork\\u\\src\\init.dat",dat_buf);
    

    然后就是不断发送数据

    always @ ( posedge clk or negedge rst_n )
    	 if( !rst_n )
    		 begin
    			 i <= 4'd0;
    			 rTX <= 1'b1;
    			 
    			 isDone <= 1'b0;
    		 end
    	 else if( tx_en_sig )
    		 case ( i )
    			 4'd0 :
    			 if( bps_clk ) begin i <= i + 1'b1; rTX <= 1'b0; end
    
    			 4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 :
    			 if( bps_clk ) begin i <= i + 1'b1; rTX <= txdata[ i - 1 ]; end
    
    			 4'd9 :
    			 if( bps_clk ) begin i <= i + 1'b1; rTX <= 1'b1;isDone <= 1'b1; end
    
    			 4'd10 :
    			 begin i <= 1'b0; isDone <= 1'b0; end
    		endcase
    

    最后就是modelsim仿真波形
    在这里插入图片描述
    上图是我要发送的数据的一部分。modelsim仿真波形如下
    在这里插入图片描述
    两条红线之间的串口发送的一帧数据,txdata是当前发送的数据,tx_pin是串口TX引脚,低位在前,停止位1位,数据8位,无校验位,因此读出来是00010011,与发送数据相同。下图是串口发送的一包数据:
    在这里插入图片描述
    现在把modeldim工程放在这里:

    展开全文
  • nRF24LE1 串口调试成功 发送数据包

    千次阅读 2011-09-29 08:52:21
    写了这么久程序,都没有... 以0x55起始 0xDD结尾 的数据包   #include #include #include #define PIN32 #ifdef PIN32 //定义I/O口方向 #define p0dir 0xf0 #define p1dir 0xff  #endif #define I
  • //----------------------------------------------顶层 module VGA_all_top ( input refclk, input rst_n, input in_top, output vs, output hs, output [4:0]r, output [5:0]g, ou...
  • Ubuntu 17.04编译串口发送16进制数据包报了个神奇的错误—续
  • 在系统环境:Ubuntu 17.04 + Clion 17.1下,在调试Ubuntu 系统通过串口发送16进制数据时,我发现了一个很神奇的问题现象。
  • fpga串口多字节、数据包发送。该资源是modelsim工程文件,下载后可直接用modelsim打开仿真。作者使用的版本是10.4
  • typedef struct{ uint8_t name; uint8_t sex; uint8_t age; .... }Person;...串口发送函数: USART1_Send((u8*)&Person,sizeof(Person)); 转载于:https://www.cnblogs.com/liangbo-1...
  • 今天小编就为大家分享一篇Python3 串口接收与发送16进制数据包的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 串口发送与接收

    千次阅读 2018-08-01 00:19:53
    1、用串口1发送数据包串口而接收。初始化程序参考正点原子串口初始化。 发送数据包函数: 串口2接收中断: u8 *res; void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2,USART_IT...
  • 基于HAL库的485串口配置,收发均使用DMA,解放CPU。通过xmodem实现数据包发送和接收,数据长度可自定义。
  • cc2420发送数据包

    2013-07-22 21:34:34
    通过测试发现,当mantis os中comBuf结构体中的size大于98时,发送节点的led灯闪烁不正常,size 大于90个字节小于98个字节的时候,发送节点的led灯显示正常,但是接收节点收不到包,灯也不亮,pc端的串口调试工具也...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 360
精华内容 144
关键字:

串口发送数据包