void Serial_SendNumber(uint32_t Number, uint8_t Length) { uint8_t i; for (i = 0; i < Length; i ++) { Serial_SendByte(Number / Serial_Pow(10, Length - i - 1) % 10 + '0'); } } int fputc(int ch, FILE *f) { Serial_SendByte(ch); return ch; } void Serial_Printf(char *format, ...) { char String[100]; va_list arg; va_start(arg, format); vsprintf(String, format, arg); va_end(arg); Serial_SendString(String); }
时间: 2024-04-02 10:31:44 浏览: 19
这段代码也是用于STM32F10x芯片通过USART1串口发送数据的函数,但是它的功能比前面的函数更为强大。它包括了三个函数:Serial_SendNumber、fputc和Serial_Printf。其中,Serial_SendNumber函数用于发送一个32位无符号整数(Number)的指定位数(Length)的十进制表示,fputc函数用于向标准输出流(stdout)输出一个字符,Serial_Printf函数用于向USART1串口发送格式化字符串。
Serial_SendNumber函数的实现中,它通过调用Serial_Pow函数计算每一位的数字,并将其转换为ASCII码发送到USART1串口。
fputc函数的实现中,它通过调用Serial_SendByte函数向USART1串口发送一个字符,并返回它的ASCII码值。
Serial_Printf函数的实现中,它通过调用vsprintf函数将格式化字符串格式化为字符数组,再通过调用Serial_SendString函数发送到USART1串口。其中,vsprintf函数是C语言标准库中的函数,它可以将格式化字符串格式化为字符数组。
相关问题
void Serial_SendString(char *String) { uint8_t i; for (i =0; String[i] != '\0';i ++) { Serial_SendByte(String[i]); } } uint32_t Serial_Pow(uint32_t X,uint32_t Y) { uint32_t Result = 1; while(Y--) { Result *=X; } return Result; } void Serial_SendNumber(uint32_t Number, uint8_t Length) { uint8_t i; for (i=0;i<Length;i++) { Serial_SendByte(Number /Serial_Pow(10,Length-i-1)%10+'0'); } }
这是一些用于发送字符串和数字的函数。Serial_SendString函数用于发送字符串,它会遍历整个字符串,将每个字符都通过Serial_SendByte函数发送出去。Serial_SendNumber函数用于发送数字,它会将数字转换为字符串形式,然后通过Serial_SendByte函数一个一个地发送出去。Serial_Pow函数用于计算指数幂,它会返回X的Y次方的结果。这些函数可以方便地在串口通信中发送字符串和数字。
uint16_t a = Test_Distance(); // Serial_SendNumber(a,3); // if(a<15){ // Car_Stop(); // Servo_SetAngle(0); Delay_ms(1000); // uint16_t b= Test_Distance(); // // Serial_SendNumber(b,3); // if(b>15){ // Servo_SetAngle(90); // Delay_ms(1000); // Self_Right(); // Delay_ms(1000); // Go_Ahead(); // // } // else { // Servo_SetAngle(180); // Delay_ms(1000); // uint16_t c= Test_Distance(); // Serial_SendNumber(c,3); // if(c>15){ // Servo_SetAngle(90); // Delay_ms(1000); // Self_Left(); // Delay_ms(1000); // Go_Ahead(); // }else{ // Servo_SetAngle(90); // while(1){}; // } // } // } // Delay_ms(100);
这段代码中包含了一些注释掉的部分,看起来是根据距离测量结果进行一些条件判断和操作。我将逐行解释这些注释掉的代码:
```c
uint16_t a = Test_Distance();
```
这行代码调用了`Test_Distance()`函数来测量距离,并将结果保存在变量`a`中。
```c
Serial_SendNumber(a,3);
```
这行代码将变量`a`的值以数字形式发送到串口。根据函数名,可以猜测这是一个用于向串口发送数字的函数。
```c
if(a<15){
Car_Stop();
Servo_SetAngle(0);
Delay_ms(1000);
uint16_t b = Test_Distance();
```
如果测得的距离小于15,执行以下操作:
- 停止车辆。
- 设置舵机角度为0度。
- 延时1秒。
- 再次测量距离,将结果保存在变量`b`中。
```c
Serial_SendNumber(b,3);
if(b>15){
Servo_SetAngle(90);
Delay_ms(1000);
Self_Right();
Delay_ms(1000);
Go_Ahead();
}
else {
Servo_SetAngle(180);
Delay_ms(1000);
uint16_t c = Test_Distance();
Serial_SendNumber(c,3);
```
如果测得的距离大于15,执行以下操作:
- 设置舵机角度为90度。
- 延时1秒。
- 右转操作。
- 延时1秒。
- 前进操作。
如果测得的距离小于等于15,执行以下操作:
- 设置舵机角度为180度。
- 延时1秒。
- 再次测量距离,将结果保存在变量`c`中。
- 将变量`c`的值以数字形式发送到串口。
```c
if(c>15){
Servo_SetAngle(90);
Delay_ms(1000);
Self_Left();
Delay_ms(1000);
Go_Ahead();
}
else{
Servo_SetAngle(90);
while(1){};
}
```
如果测得的距离大于15,执行以下操作:
- 设置舵机角度为90度。
- 延时1秒。
- 左转操作。
- 延时1秒。
- 前进操作。
如果测得的距离小于等于15,执行以下操作:
- 设置舵机角度为90度。
- 进入死循环,停止程序执行。
```c
Delay_ms(100);
```
延时100毫秒。
需要注意的是,上述代码中的`Serial_SendNumber()`、`Car_Stop()`、`Servo_SetAngle()`、`Self_Right()`、`Self_Left()`和`Go_Ahead()`函数没有在提供的代码中定义。你需要根据实际情况自行实现这些函数。