本文简介:本文主要介绍匿名上位机V7版本的一些基本的功能使用,以及基于匿名上位机协议写下位机代码。使用的下位机为STM32F103C8T6
V7版本的选项简介,划线部分是比较基础的部分,对于智能车调试,波行分析比较好用。
基本的功能是基本收发,类似串口精灵或者XCOM。
通过连接设置(点击)可以设置通信方式,有串口通信和USB HID通信方式。本文主要介绍串口通信。
连接设置好就可以打开连接了,下面是连接成功的状态。
你发送的数据下面会有发送计数,可以通过基本收发这里面判断上位机与下位机的连接情况
可以通过设置那里选择用户的自定义波形,有10个容器可以选择,也就是可以同时显示10个波形,在左边打上勾就可以显示波行了
通过观察,发现软件界面左侧或者右侧会有虚线,把鼠标移动过去即可打开隐藏的选项。
帮助信息那里会有比较详细的使用资料和视频,具体使用可以查看帮助信息
通过上面介绍,我们了解到了怎么连接上位机与下位机,如何使用波形显示界面,下面将通过分析通信协议,写下位机代码。(具体协议请自行查看帮助信息的通信协议)
通过匿名协议的方式,确定一帧数据的构成,一帧数据的不同位置,功能不同,至于后面的校验和附加校验也不需要怎么理解,直接套用即可。需要注意的数据内容采取的是小端模式
灵活格式帧,是用户能够自定义一帧数据的数据长度和数据内容,比较灵活,因此只是介绍它,这个也是发送到上位机的数据。
组成:
注意ID,是由0XF1~0XFA
C代码分析
发送一帧数据代码
/**********为了匿名四轴上位机的协议定义的变量****************************/
//cup为小端模式存储,也就是在存储的时候,低位被存在0字节,高位在1字节
#define BYTE0(dwTemp) (*(char *)(&dwTemp)) //取出int型变量的低字节
#define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1)) // 取存储在此变量下一内存字节的内容,高字节
#define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
u8 BUFF[30];
void sent_data(u16 A,u16 B,u8 C)
{
int i;
u8 sumcheck = 0;
u8 addcheck = 0;
u8 _cnt=0;
BUFF[_cnt++]=0xAA;//帧头
BUFF[_cnt++]=0xFF;//目标地址
BUFF[_cnt++]=0XF1;//功能码
BUFF[_cnt++]=0x05;//数据长度
BUFF[_cnt++]=BYTE0(A);//数据内容,小段模式,低位在前
BUFF[_cnt++]=BYTE1(A);//需要将字节进行拆分,调用上面的宏定义即可。
BUFF[_cnt++]=BYTE0(B);
BUFF[_cnt++]=BYTE1(B);
BUFF[_cnt++]=C;
//SC和AC的校验直接抄最上面上面简介的即可
for(i=0;i<BUFF[3]+4;i++)
{
sumcheck+=BUFF[i];
addcheck+=sumcheck;
}
BUFF[_cnt++]=sumcheck;
BUFF[_cnt++]=addcheck;
for(i=0;i<_cnt;i++) UsartSendByte(USART1,BUFF[i]);//串口逐个发送数据
}
串口初始化代码
注意一下基础配置为,字长为8位数据格式,一个停止位
无奇偶校验位,
void usart1_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
配置完上述,在定时器上调用发送数据函数即可
//定时器3中断服务程序
//10Khz的计数频率,计数到50为5ms
void TIM3_IRQHandler(void) //TIM3中断
{
static u16 A=0,B=2;
static u8 C;
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
C=A+B;
A++;B++;
sent_data(A,B,C);
}
}
至此,下位机配置完成。
上位机再进行简单配置,即可进行波形显示
进入上位机协议通信,打开右侧,进行自定义帧数配置,与下位机接收的数据进行匹配,如图。
下面数据容量配置是与波形显示界面配置
到此配置完成,烧录代码,打开上位机连接即可,通过查看下放的错码率可以知道自己的下位机代码是否写错了
下面进行简单演示