任务一
# 任务1
int main(void){
uint8_t letter;
usart1_init();
while(1){
for(letter = 'a';letter <= 'z';letter++){
while(!(USART1->SR & USART_SR_TXE)); // while - uart fason wanchen , juxu next
// while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); // and yes
// delay();
USART_SendData(USART1,letter);
}
}
}
任务二
//任务2
//int main(void){
// usart1_init();
// while(1){
// while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET); // stm32的标志位(寄存器)没有接收到数据的时候置零,一直等待数据的到来(while循环)
// uint8_t ch = USART_ReceiveData(USART1); // 接受的字符
// // 判断
// if(ch>=97 && ch<=122)
// {
// ch -= 32;
// USART_SendData(USART1,ch);
// }
// else{USART_SendData(USART1,ch);}
// }
//}
任务三
解题思路:
/*
首先接收一个字符,然后判断这个字符是否为数字字符。
如果是数字字符,则执行主功能模块;
如果不是数字字符,则直接将该字符发送回给上位机。
在主功能模块中,当接收到三个数字字符时,计算它们的整数值,
并将这个整数值转换为字符数组,最后将字符数组发送回给上位机。
*/
解答代码:
int arr_int[3] = {0,0,0}; // 存储一位一位的整数(int数组)
char arr_char[4] = {'a','b','c','\0'}; // 存储接收到的字符整数(char数组)
int num , count , flag = 0;
// num存储返回和计算和的整数值,count记录存储了多少个整数或者说几次(为3就赋值为0),flag来判断接收了字符整数没
int main(void){
usart1_init(); // 串口1初始化函数
while(1){
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET); // 等待接收数据,标志位置0还是置1。
uint8_t ch = USART_ReceiveData(USART1); // 接受的字符
// 判断接收的字符是不是字符整数,如果是的话就执行主功能,不是则直接输出该字符回给上位机
if(ch<=48 || ch>=57){
USART_SendData(USART1, ch);
}
else{ // 主功能模块
flag = 1; // flag=1代表接收到了字符整数,为下面count==3时做铺垫。
if(count == 3 ){
count = 0; // 置0
num = arr_int[2]*10*10 + arr_int[1]*10 + arr_int[0] + 55; // 计算返回的整数值,因为接收的数据和正常的是相反的,所以这里数组也是。
USART_SendData(USART1,1);
arr_char[0] = (char)num/100; // 百位
arr_char[1] = (char)(num%10)/10; // 十位
arr_char[2] = (char)num%10; // 个位
for(int i =0;i<3;i++) USART_SendData(USART1,arr_char[i]); // 依次返回字符整数数据给上位机显示。
if(flag == 1){
// 这里和上面的flag=1相呼应,因为先判断了count==3的情况,万一这个时候也输入了一个整数呢?所以就在这里加上个判断来赋值
arr_int[count] = ch - '0'; // 每一位都减去字符0就可以从字符转为十进制本身数值.
count ++; // count次数加一
}
}
else{
arr_int[count] = (int)ch - '0'; // 每一位都减去字符0就可以从字符转为十进制本身数值.
count ++; // count次数加一
}
}
}
}
有问题: