毕业设计求帮助 分全给您 Help!!
我做的是上位机,用的是VC和下位机通信下位机程序是板子自带的
上下位机用串口通信 求一个串口发送和接受函数
case UART_CMD_SET_PID: //设定PID参数命令
i=(long)(UartData[1]+(UartData[2]<<8)+(UartData[3]<<16)+((UartData[4]& 0x7F)<<24));
TsmpCnt=(uint8)(i/(Tsmp*1000));
Ka_PC=Bytes_To_Long(UartData+5);
Kb_PC=Bytes_To_Long(UartData+9);
Kc_PC=Bytes_To_Long(UartData+13);
Uart_DcMt_Send(&UartCmd,1);
break;
发送PID控制命令,无非是十六进制发过去,他自己转换成long型
关键是我不太会,不知道怎么把string型的转换成uint8型的,我是自动化专业的,VC不太会
再求个接收函数,这样可以看到自己发的是什么,对不对
我现在的程序,已经可以收发数据了,就剩改成16进制控制下位机了
求高人帮下忙吧 谢谢大大们了
答辩在即 时间很紧张 请快些
下面是下位机的主函数
int main(void)
{
uint8 UartCmd;
uint16 UartDataLen;
long i;
Delay(0xF000); //复位延时
//使用6MHz时钟源
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER1);
IntMasterEnable(); //使能全局中断
Uart0Init(115200, 1<<5) ; //初始化串口0
GPIOInit(2<<5); //初始化GPIO
Timer1Init(3<<5); //初始化定时器1
InitPwmTmr(PWM_Cycle, (uint16)CurDuty); //初始化定时器0
CompInit(4<<5); //初始化比较器0
LED2_OFF();
BUZ_OFF();
QueueCreate(Speed_Queue, //初始化转速队列
SPEED_NUM_MAX*4+20,
0,
0);
while(1)
{
if(Uart_DcMt_Rec(Uart0_Rec_Queue,
UartData,
&UartDataLen,
&UartTimeout,
20)==UART_OK) //接收到上位机的命令帧
{
UartCmd=UartData[0]; //提出命令字节
switch(UartCmd)
{
case UART_CMD_SET_PID: //设定PID参数命令
i=(long)(UartData[1]+(UartData[2]<<8)+(UartData[3]<<16)+((UartData[4]& 0x7F)<<24));
TsmpCnt=(uint8)(i/(Tsmp*1000));
Ka_PC=Bytes_To_Long(UartData+5);
Kb_PC=Bytes_To_Long(UartData+9);
Kc_PC=Bytes_To_Long(UartData+13);
Uart_DcMt_Send(&UartCmd,1);
break;
case UART_CMD_SET_SPEED: //设定转速命令
ExpSpeed=Bytes_To_Long(UartData+1);
Uart_DcMt_Send(&UartCmd,1);
break;
case UART_CMD_GET_RECORD: //记录转速
SpeedNum = Bytes_To_Long(UartData+1);
if(SpeedNum>SPEED_NUM_MAX)
{ SpeedNum=SPEED_NUM_MAX; }
QueueFlush(Speed_Queue);
Auto_Rec_Speed=1;
while( QueueNData(Speed_Queue) < (SpeedNum*4) );
Auto_Rec_Speed=0;
UartData[0]=UART_CMD_GET_RECORD;
i=TsmpCnt*10;
Long_To_Bytes(i, UartData+1);
i=SpeedNum;
Long_To_Bytes(i, UartData+5);
for(i=0; i<(SpeedNum*4); i++)
{ QueueRead(UartData+9+i, Speed_Queue); }
Uart_DcMt_Send(UartData, SpeedNum*4+9);
break;
case UART_CMD_AUTO_RECORD: //自动记录转速
SpeedNum = Bytes_To_Long(UartData+1);
if(SpeedNum>SPEED_NUM_MAX)
{ SpeedNum=SPEED_NUM_MAX; }
QueueFlush(Speed_Queue);
Auto_Rec_Speed=1;
Uart_DcMt_Send(&UartCmd,1);
break;
case UART_CMD_STOP_RECORD: //停止记录转速
Auto_Rec_Speed=0;
QueueFlush(Speed_Queue);
Uart_DcMt_Send(&UartCmd,1);
break;
} //switch
} //if
if( Auto_Rec_Speed && (QueueNData(Speed_Queue) >= (SpeedNum*4)) )
{
UartData[0]=UART_RES_SPEED;
for(i=1; i<=(SpeedNum*4); i++)
{ QueueRead(UartData+i, Speed_Queue); }
Uart_DcMt_Send(UartData, SpeedNum*4+1);
}
if(OverCur)
{
BUZ_ON();
LED2_ON();
}
else
{
BUZ_OFF();
LED2_OFF();
}
} //while(1)
return(0);
}