使用
labview2013编写的串口程序
功能:
1.可以设置数据接收协议和数据发送协议。
2.可以发送或者接收u8/s8/u6/s16/u32/s32/float/double等多种数据类型。
3.可已设置接收数据长度/类型。
4.可设置发送数据长度和类型
5.可自动记录上次的数据协议和串口波特率等
单片机发送使用实例:
1.单片机发送协议:: 0xFFD8 数据1 数据2 数据3 数据 4 0xFFD9
示例代码:
- union DOUBLE_CHAR
- {
- char char_buf[8];
- double double_buf;
- }double_char;
- union FLOAT_CHAR
- {
- char char_buf[4];
- float float_buf;
- } float_char;
- union UNINT_CHAR
- {
- char char_buf[4];
- unsigned int int_buf; //车轮的实际速度 单位:脉冲/s
- }unint_char;
- /**
- * @Description: 发送到电脑上位机的数据,连接在uart2上
- * @param current - 电机电流值(A)
- * @param speed - 电机速度
- * @note1 :数据协议 0xFFD8 电机电流float型(4Bytes) 电机速度float型(4Bytes) 0xFFD9
- */
- void report_data(float current,float speed,float angle,float target_speed)
- {
- u8 i;
-
- uart3_tx.buf[0] = 0xFF;
- uart3_tx.buf[1] = 0xD8;
- float_char.float_buf=current;
- for (i=0;i<4;i++)
- {
- uart3_tx.buf[i+2] = float_char.char_buf[3-i]; //注意需要倒着发送
- }
- float_char.float_buf=speed;
- for (i=0;i<4;i++)
- {
- uart3_tx.buf[i+6] = float_char.char_buf[3-i]; //注意需要倒着发送
- }
- float_char.float_buf=angle;
- for (i=0;i<4;i++)
- {
- uart3_tx.buf[i+10] = float_char.char_buf[3-i]; //注意需要倒着发送
- }
- float_char.float_buf=target_speed;
- for (i=0;i<4;i++)
- {
- uart3_tx.buf[i+14] = float_char.char_buf[3-i]; //注意需要倒着发送
- }
- uart3_tx.buf[18] = 0xFF;
- uart3_tx.buf[19] = 0xD9;
- USART3_DMA_Send_Once_Data(uart3_tx.buf, 20);
- }
- /**
- * @Description: 上位机发送给单片机,连接在uart3上
- * @note1 :数据协议 0xFFD8 模式0x00(1Bytes) HT值0x00(1Bytes) 0xFFD9
- */
- void receive_check(void)
- {
- if(uart3_rx.len==6)
- {
- if (uart3_rx.buf[0]==0xFF&&uart3_rx.buf[1]==0xD8) //数据头不对,则重新开始寻找0x55数据头
- {
- system_info.HT=(double)uart3_rx.buf[3];
- switch(uart3_rx.buf[2])
- {
- case 0x00: //
- system_info.rehab_mode=No_Mode;
- system_info.work_mode =Run_Zero;
- break;
- case 0x01: //
- system_info.rehab_mode=Judge_Mode;
- break;
- case 0x02: //
- system_info.rehab_mode=Passive_Mode;
- break;
- case 0x03: //
- system_info.rehab_mode=Induce_Node;
- break;
- case 0x04: //
- system_info.rehab_mode=Active_Mode;
- break;
- default :
- break;
- }
-
- }
- uart3_rx.len=0;
- }
- }
- /**
- * @Description: 串口3report进程
- */
- extern double current_d;
- void thread_report( void *parameter )
- {
- float temp;
- //uart3_tx.buf[0] = 0xFF; /* 帧头 */
- //uart3_tx.buf[1] = 0xD8; /* 帧头 */
- //uart3_tx.buf[6] = 0xFF; /* 帧尾 */
- //uart3_tx.buf[7] = 0xD9; /* 帧尾 */
-
- /* 初始化静态信号量,初始值是0 */
- rt_sem_init( &report_sem, "report", 0, RT_IPC_FLAG_FIFO );
- USART3_DMA_Init(115200);
- while (1)
- {
- rt_sem_take( &report_sem, 10 ); //10ms发送一次
- //temp=motor.target_speed /24.45f*1000;
-
- report_data(motor.current.current, output_shaft.speed*1000,output_shaft.postion,current_d);
-
- receive_check();
- }
- }