写在前面
我最近在调试购物车的底盘,底盘上有一个光电传感器,是通过串口接收命令并且进行上传感应结果的,第一次使用,特此写一篇博客记录调试过程,并且会在最后放出调试结果数据流传是这样的,首先由STM32F103C8T6芯片(后简称为103)发送数据读取命令0x57给光电传感器,光电传感器接收到数据读取命令之后会通过光电传感器上的串口发送其16个灯的状态给103(亮0灭1),最后由103通过USART1将光电传感器的数据传给USB-TTL,并在PC端的串口助手查看结果。
CubeMX配置工程
这个是配置芯片的总览图,可以看到我只用了USART1,因为103通过USART1_TX将数据读取命令发送给光电传感器,光电传感器接收到数据读取命令之后会将传感器结果通过USB-TTL传到PC端,这样就可以在PC端的串口助手里查看光电传感器的数据
接下来配置RCC和SYS,这2个模块在大部分芯片里都是大同小异的哦
这个是配置串口模式,下面没有截取的部分我都是用的默认的波特率9600,因为这个工程对于实时性的要求不高,因此我选择了异步通信(Asynchronous)
这个是工程的一些经验配置,可以让工程文件小一些,因为我用的是keil5的开发环境所以我IDE选的是MDK-ARM V5,具体可以根据自己的IDE来选择
最后点这个生成工程就可以了
Keil5工程配置
我配置的这个工程出现了一个问题 折腾了一会儿,发现是我工程配置出了问题,放一下解决办法 首先我们需要去官网上下载芯片包:
https://www.keil.com/dd2/Pack/
下载的是如下图红框内所示的芯片包
然后打开keil的pack installer进行import芯片包,import直接选择上述芯片包的文件夹即可,文件夹里面有其他东西也没关系
import进芯片包之后点开keil上面的导航栏里的魔术棒,进入到Device选项卡,进行芯片的选择
芯片选择完毕之后进入到Debug选项卡,并且进入Setting 在Setting内选择Flash Download,查看Programming Algorithm里面是否有这个选项,有的话点确定就可以了,如果没有的话就点add把它加进来就可以了,如果点开add之后没有这个选项的话就是之前一些步骤出问题了,回溯一下看看自己漏了哪些东西。
程序调试
先放程序再讲解
#define buffer_size 1024
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t sensor_code = 0x57;
uint8_t uart6Rx[16];
/* 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_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit(&huart1, (uint8_t *)&sensor_code, 1, 1000);
HAL_Delay(100);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
main程序里面是这样的,在while(1)里面每隔100ms发送一次数据读取命令(0x57),延时主要是因为芯片通信时硬件处理指令也是需要时间的,如果数据发送的过快的话逻辑会出问题,很有可能会发生数据丢包或者程序跑飞的情况,因此我在这里做了这个延时。这个延时操作在很多需要通信的地方都用得到,因为我们需要延时来消除这段时间对我们的整体程序逻辑的影响。
回到我们这个话题,当光电传感器接收到数据读取命令(0x57)之后,会通过串口发送数据到USB-TTL,这样我们就可以在PC端的串口助手看到光电传感器所感知到的数据了。
根据分析测试得出,当接收到数据请求指令后,光电传感器会发送一个字节的数据,这个字节的16个byte分别代表了16个巡迹灯的状态,如果有遮挡的话就会将该巡迹灯对应的byte置为1,具体的对应关系如下图所示: 如上图所示,红色的点表示光电传感器的巡迹灯,我将其从0到15进行了编号,黑色的0表示了一个字节的16个byte,左边8个巡迹灯是低8位,右边8个巡迹灯是高8位
(づ ̄3 ̄)づ╭❤~一键三连,这次一定(๑•̀ㅂ•́)و✧