金牌会员
积分 1027
金钱 1027
注册时间 2016-1-28
在线时间 135 小时
1 金钱
STM32 和电脑串口通讯 如果通讯前,单片机按复位,返回给电脑的速度就快,如果不按,返回给电脑的就很慢,但数值仍是对的,问?
/*******************************************************************************
* 函数名称:USART1_Command()
* 函数功能:执行上位机任务
* 入口参数:无
* 出口参数:无
* 返 回 值:无
*******************************************************************************/
void USART1_Command(void)
{
uint16_t i,j;
uint8_t CmdMode=0xFF;
float Temp;
if((RxBuffer1[RxCounter1-2] !='P')||(RxBuffer1[RxCounter1-1] !='P')) return;
switch(RxCounter1){
case 6: /* 判断是否测试命令 *//*V1.2*/
for(i=0;i<12;i++) /*i:命令的条数*/
{
for(j=0;j<6;j++) /*j:命令长度*/
{
if(RxBuffer1[j] != TAB_UART1CMD[i][j]) break;
}
if(j>=6)
{
CmdMode=i;
break;
}
}
break;
case 16: /* 判断是否参数设置命令 */
if((RxBuffer1[0] =='A')&&(RxBuffer1[1] =='A'))
{
CmdMode=12; // V1.1
}
else
{
return;
}
break;
default:
return;
}
switch(CmdMode){
case 0: /*采集电流*/
GetADData_3012(0,0);break;
case 1: /*采集目标Mic灵敏度*/
GetADData_3012(1,0);break;
/* sprintf(TxBuffer1,"70HZ%03dSS1KHZ%03dSS5KHZ%03dSSLEAK %03d %03dSS",360,360,360,0,0);
TxCounter1=41;
TxIndex1=0;
USART_SendData(USART1, TxBuffer1[TxIndex1]);break;*/
case 2: /*采集标准Mic灵敏度*/
GetADData_3012(1,1);break;
case 3:
case 4:
case 5:
case 6:/* 继电器控制*/
KJ_Init(CmdMode-2,0x01&(~(KJ_ReadState(CmdMode-2))));
/////////////////////////
TxBuffer1[0]=0x30+CmdMode-2; //////599-610应答信号
TxBuffer1[1]=TxBuffer1[0];
if(0==KJ_ReadState(CmdMode-2)){
TxBuffer1[2]='L';
TxBuffer1[3]='L';
}else{
TxBuffer1[2]='H';
TxBuffer1[3]='H';
}
/*
TxCounter1=4;
TxIndex1=0;
USART_SendData(USART1, TxBuffer1[TxIndex1]);*/
TxBuffer1[4]='\0';
printf("%s",TxBuffer1);
//////////////////////////////
break;
/* 20160104 */
case 7:/*单独70测试*/
GetADData_Fre(0,0);break;
case 8:/*单独1K测试*/
GetADData_Fre(0,1);break;
case 9:/*单独5K测试*/
GetADData_Fre(0,2);break;
case 10:/*单独1B测试*/
GetADData_Fre(0,3);break;
/*V1.2*/
case 11:
//Delay_ms(20);
__set_FAULTMASK(1); // 关闭所有中端
NVIC_SystemReset();// 复位
break;
case 12: /* 参数设置 */
for(i=2;i<14;i++){
if((RxBuffer1[i] <'0')||(RxBuffer1[i] >'9')) return;
}
/* 电压参数 */
Temp=RxBuffer1[2]-0x30;
Temp*=10;
Temp+=(RxBuffer1[3]-0x30);
System_InitData.VOLTAGE=Temp/10;
/* 电阻参数 */
Temp=RxBuffer1[6]-0x30;
Temp*=10;
Temp+=(RxBuffer1[7]-0x30);
Temp*=10;
Temp+=(RxBuffer1[8]-0x30);
Temp*=10;
Temp+=(RxBuffer1[9]-0x30);
Temp/=1000;
for(i=0;i<8;i++){
if(Temp==TAB_RESISTOR[i]) break;
}
if(i<8){
System_InitData.RESINDEX=i;
}else{
System_InitData.RESINDEX=0;
}
/* 延时参数 */
i=RxBuffer1[10]-0x30;
i*=10;
i+=(RxBuffer1[11]-0x30);
i*=10;
i+=(RxBuffer1[12]-0x30);
i*=10;
i+=(RxBuffer1[13]-0x30);
System_InitData.DELAYTIME[0]=i;
System_StateFresh(); /****系统动作参数刷新****/
TxBuffer1[0]='O';
TxBuffer1[1]='K';
/*TxCounter1=2;
TxIndex1=0;
USART_SendData(USART1, TxBuffer1[TxIndex1]);*/
TxBuffer1[2]='\0';
printf("%s",TxBuffer1);
/*
Delay_ms(20);
__set_FAULTMASK(1); // 关闭所有中端
NVIC_SystemReset();// 复位
*/
break;
}
}
/*******************************************************************************
* 函数名称:USART_Configuration()
* 函数功能:USART 配置
* 入口参数:无
* 出口参数:无
* 返 回 值:无
*******************************************************************************/
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600; /* 波特率:9600 */
USART_InitStructure.USART_WordLength = USART_WordLength_8b; /* 数据位:8 */
USART_InitStructure.USART_StopBits = USART_StopBits_1; /* 停止位: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; /* 二线模式 */
/* Configure the USART1,3 */
USART_Init(USART1, &USART_InitStructure);
USART_Init(USART3, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); /* 允许接收中断 */
//USART_ITConfig(USART1, USART_IT_TC, ENABLE); /* 允许发送完成中断 */
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); /* 允许接收中断 */
//USART_ITConfig(USART3, USART_IT_TC, ENABLE); /* 允许发送完成中断 V1.5 */
USART_ITConfig(USART1, USART_IT_PE, ENABLE); //开启PE错误接收中断Bit 8PEIE: PE interrupt enable
//CR2 开启ERR中断
USART_ITConfig(USART1, USART_IT_ERR, ENABLE);
/* Enable USART1,3 */
USART_Cmd(USART1, ENABLE);
USART_Cmd(USART3, ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_ClearFlag(USART3,USART_FLAG_TC);
}
/*******************************************************************************
* 函数名称:USART1_IRQHandler()
* 函数功能:USART1中断处理,清除中断标志,接收数据或发送数据
* 入口参数:无
* 出口参数:无
* 返 回 值:无
*******************************************************************************/
void USART1_IRQHandler(void)
{
uint8_t Temp;
int Count;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Temp = USART_ReceiveData(USART1); //接收1字节数据
if(0==USART1_RxFlag){
RxBuffer1[RxCounter1] = Temp; // 保存到接收缓冲区
RxCounter1++;
switch(RxBuffer1[0]){
case 'A':
Count=16;
break;
case 'S':
Count=6;
break;
default:
RxCounter1=0;
Count=32;
break;
}
if(RxCounter1==Count) USART1_RxFlag=1;
}
TimeCount_USART1=Time_mS_Value;
USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除接收中断标志
}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_TC); //清除发送中断标志
TxCounter1--;
if(TxCounter1>0){
TxIndex1++;
USART_SendData(USART1, TxBuffer1[TxIndex1]); // 发送1字节数据
}
}
}
我来回答