1、实验目的
掌握上位机编程;
掌握F4串口;
掌握两者通信数据帧的约定;
2、实验设备
stm32F4核心板,Lcd屏幕,下载器,电脑。
3、完成的任务
(1)已经完成定长数据帧的约定(采用帧头、帧尾以及和检验三方面的方式);
(2)已经完成超时重发的内容(这里完成的是32端的超时重发函数,应答信号采取连续发送方式,没有超时。);
(3)完成浮点数、整型数据的数据的传送到上位机;上位机接收到数据,然后发送应答信号,32停止发送,不然32在约定的超时时间内收不到上位机的应答信号,将继续重发N次,N次都收不到上位机的应答信号,那么就报错(报错将重新运行32的程序,这里没做,后面有时间再做,类似于看门狗监测,还没学到看门狗,后面再说。)
(4)完成IO信号的发送,单片机发送IO信号给上位机,上位机接收到IO信号,就发应答信号给单片机,单片机在超时重发机制下,将不再发IO信号给上位机,完成一次有效的发送。
(5)完成上位机C#端的编写。
4、串口通信数据帧的格式约定
(1)说明1:定长数据发送,总共13个 字节,没用到的数据位,默认用0x55;
(2)帧头用两个0x21,0x22;
(3)采用和校验方法,和校验的数据是D2—D9,得到的结果放在D10中;
(4)帧尾用0x0D,0x0A;
整体说明:包括六个步进电机,每个步进电机有三个传感器,左限位开关,右限位开关,原点开关,有六个IO开关,比如电磁阀等。
步进电机:
包括:行程,mm单位,脉冲单位;速度,mm/s单位,pul/s单位;
这里特别注定一下:
所设定的应答信号,不管是单片机给电脑发信息,电脑给单片机发应答号的情况,,,,还是,,电脑给单片机发信号,单片机回发应答信号。这里两种情况,都是用同样的应答信号,而没有区分不同的数据下的应答信号。就是说,应答号都一模一样。
这里是为了简化。
5、单片机给电脑发信号,电脑接收到,解码之后,马上回发应答信号给单片机。
5.1单片机端的串口代码usart.c和usart.h
usart…h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "stm32f4xx.h"
#include "delay.h"
#include "Lcd_Driver.h"
#define USART1_RX_MAX 200
extern union FloatChar floattemp;
extern union Int32Char int32temp;
extern u8 USART1_RX_BUF[USART1_RX_MAX];
extern u8 USART1_RX_Flag ;
extern u16 USART1_RX_Size ;
extern u16 USART1_RX_STA;
extern u8 USART_RecAckFlag;
extern u16 USART_RecAckTime;
extern u8 USART_RetrySendCount;
extern u8 USART1_RecFrameAckFlag;
extern u8 USART1_RecFrameFlag;
extern u8 USART1_RecCheckFrameFlag;
extern u8 USART1_RecDoubleBufRxd[64];
#define UART1_Rec_Head0 0x21
#define UART1_Rec_Head1 0x22
#define UART1_Default_Char 0x55
#define UART1_Rec_Tail0 0x0D
#define UART1_Rec_Tail1 0x0A
#define DevMotorX 0x00
#define DevMotorY 0x01
#define DevMotorZ 0x02
#define DevMotorA 0x03
#define DevMotorB 0x04
#define DevMotorC 0x05
#define DevXLeftLimit 0x50
#define DevXRightLimit 0x51
#define DevXOrigin 0x52
#define DevYLeftLimit 0x53
#define DevYRightLimit 0x54
#define DevYOrigin 0x55
#define DevZLeftLimit 0x56
#define DevZRightLimit 0x57
#define DevZOrigin 0x58
#define DevALeftLimit 0x59
#define DevARightLimit 0x5A
#define DevAOrigin 0x5B
#define DevBLeftLimit 0x5C
#define DevBRightLimit 0x5D
#define DevBOrigin 0x5E
#define DevCLeftLimit 0x5F
#define DevCRightLimit 0x60
#define DevCOrigin 0x61
#define DevIO_S1 0x80
#define DevIO_S2 0x81
#define DevIO_S3 0x82
#define DevIO_S4 0x83
#define DevIO_S5 0x84
#define DevIO_S6 0x85
#define FunMotorMM 0x00
#define FunMOTORPUL 0x01
#define FunMotorVELMM 0x02
#define FunMotorVELPUL 0x03
#define FunMotorDIR 0x04
#define FunMotorRUN 0x05
#define FunMotorSTOP 0x06
#define FunIO_Sig 0x00
#define FunLimitSense_Sig 0x01
#define Fun_Ack 0xDD
#define DatLimitSenseUP 0x00
#define DatLimitSenseDown 0x01
#define DatDirCW1 0
#define DatDirCCW1 1
#define DatDirCW2 0
#define DatDirCCW2 1
#define DatDirCW3 0
#define DatDirCCW3 1
#define DatDirCW4 0
#define DatDirCCW4 1
#define DatDirCW5 0
#define DatDirCCW5 1
#define DatDirCW6 0
#define DatDirCCW6 1
#define DatIO_S1_OFF_Sig 0x00
#define DatIO_S1_ON_Sig 0x01
#define DatIO_S2_OFF_Sig 0x00
#define DatIO_S2_ON_Sig 0x01
#define DatIO_S3_OFF_Sig 0x00
#define DatIO_S3_ON_Sig 0x01
#define DatIO_S4_OFF_Sig 0x00
#define DatIO_S4_ON_Sig 0x01
#define DatIO_S5_OFF_Sig 0x00
#define DatIO_S5_ON_Sig 0x01
#define DatIO_S6_OFF_Sig 0x00
#define DatIO_S6_ON_Sig 0x01
#define Dat_AckOK 0xf0
#define Dat_AckNG 0xf1
/*----------------------USART配置宏 ------------------------*/
#define UART1_TXD_PIN GPIO_Pin_9
#define UART1_TXD_PORT GPIOA
#define UART1_TXD_CLK RCC_AHB1Periph_GPIOA
#define UART1_TXD_CLK_ENABLE() {RCC_AHB1PeriphClockCmd(UART1_TXD_CLK,ENABLE);}
#define UART1_TXD_PINSOURCE GPIO_PinSource9
#define UART1_RXD_PIN GPIO_Pin_10
#define UART1_RXD_PORT GPIOA
#define UART1_RXD_CLK RCC_AHB1Periph_GPIOA
#define UART1_RXD_CLK_ENABLE() {RCC_AHB1PeriphClockCmd(UART1_RXD_CLK,ENABLE);}
#define UART1_RXD_PINSOURCE GPIO_PinSource10
#define UART1_CLK_ENABLE() {RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);}
extern void Uart1Action(unsigned char *buf, unsigned char len);
void Usart1_Config(u32 BaudRate);
unsigned char Uart1Read(unsigned char *buf, unsigned char len);
void Uart1Driver();
void Usart1_send(u8 byte);
u8 Usart1_GetCheckSum(u8 *ptr,u8 csumbegin,u8 CsumCalLen);
void Usart1_CheckAndDoAction();
void Usart1_DoAction(unsigned char *buf, unsigned char len);
u8 uart1SendSucAckCmd(u8 DeviceNum,u8 DeviceACKOK,u8 RetryNum,u16 timeout);
u8 uart1SendIOCmd(u8 DeviceNum,u8 sendiostatus,u8 RetryNum,u16 timeout);
u8 Uart1SendFloatDataCmd(u8 DeviceNum,u8 DevFunNum,float sendFloatdata,u8 RetryNum,u16 timeout);
u8 Uart1SendInt32DataCmd(u8 DeviceNum,u8 DevFunNum,int32_t sendint32,u8 RetryNum,u16 timeout);
void aaa(void);
#endif
usart.c
#include "usart.h"
union FloatChar
{
char floatchararray[4];
float floatdata;
};
union Int32Char
{
char intchararray[4];
int32_t intdata;
};
union FloatChar floattemp;
union Int32Char int32temp;
u8 USART1_RX_BUF[USART1_RX_MAX];
u8 USART1_RX_Flag = 0;
u16 USART1_RX_Size = 0;
u16 USART1_RX_STA=0;
u16 UART1_REC_Length=0;
u8 USART_RecAckFlag=0;
u16 USART_RecAckTime=1000;
u8 USART_RetrySendCount=5;
u8 USART1_RecFrameAckFlag=0;
u8 USART1_RecFrameFlag=0;
u8 USART1_RecCheckFrameFlag=0;
u8 USART1_RecDoubleBufRxd[64];
void Usart1_Config(u32 BaudRate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
UART1_TXD_CLK_ENABLE();
GPIO_InitStructure.GPIO_Pin = UART1_TXD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(UART1_TXD_PORT,&GPIO_InitStructure);
UART1_RXD_CLK_ENABLE();
GPIO_InitStructure.GPIO_Pin = UART1_RXD_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(UART1_RXD_PORT,&GPIO_InitStructure);
UART1_CLK_ENABLE();
GPIO_PinAFConfig(UART1_TXD_PORT,UART1_TXD_PINSOURCE,GPIO_AF_USART1);
GPIO_PinAFConfig(UART1_RXD_PORT,UART1_RXD_PINSOURCE,GPIO_AF_USART1);
USART_InitStructure.USART_BaudRate = BaudRate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_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;
USART_Init(USART1, &USART_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
USART_Cmd(USART1, ENABLE);
NVIC_Init(&NVIC_InitStructure);
}
int fputc(int c, FILE *fp)
{
USART_SendData( USART1,(u8)c );
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return (c);
}
void USART1_IRQHandler(void)
{
u8 RES;
u8 csumtemp=0;
static u8 counttemp=1;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
RES =USART_ReceiveData(USART1);
if((USART1_RX_STA & 0x8000)==0)
{
if(USART1_RX_STA&0x4000)
{
if(RES!=UART1_Rec_Tail1)
USART1_RX_STA=0;
else
{
USART1_RX_STA|=0x8000;
USART1_RecFrameFlag=1;
Usart1_CheckAndDoAction();
}
}
else
{
if(RES==UART1_Rec_Tail0)
{
USART1_RX_STA|=0x4000;
}
else
{
if(USART1_RX_STA==0)
{
if(RES==UART1_Rec_Head0)
{
USART1_RX_BUF[0]=RES ;
USART1_RX_STA=1;
}
else
USART1_RX_STA=0;
}
else if(USART1_RX_STA==1)
{
if(RES==UART1_Rec_Head1)
{ USART1_RX_BUF[1]=RES ;
USART1_RX_STA=2;
}
else
USART1_RX_STA=0;
}
else if(USART1_RX_STA>1)
{
USART1_RX_BUF[USART1_RX_STA]=RES ;
USART1_RX_STA++;
if(USART1_RX_STA>(USART1_RX_MAX-1))
USART1_RX_STA=0;
}
}
}
}
}
}
/* 串口驱动函数,监测数据帧的接收,调度功能函数,需在主循环中调用 */
void Uart1Driver()
{
unsigned char len;
unsigned char buf[15];
if (USART1_RecFrameFlag)
{
USART1_RecFrameFlag = 0;
len = Uart1Read(buf, sizeof(buf));
Usart1_DoAction(buf, len);
}
}
unsigned char Uart1Read(unsigned char *buf, unsigned char len)
{
unsigned char i;
for (i=0; i<len; i++)
{
*(buf+i) = USART1_RX_BUF[i];
}
return len;
}
u8 Usart1_GetCheckSum(u8 *ptr,u8 csumbegin,u8 CsumCalLen)
{
u8 t;
u8 checksumtemp=0;
for(t=csumbegin;t<=(csumbegin+CsumCalLen-1);t++)
{
checksumtemp+=*(ptr+t);
}
checksumtemp=checksumtemp%256;
return checksumtemp;
}
void Usart1_CheckAndDoAction()
{
u8 checksumtemp=0;
u8 lentemp=0;
u8 usart1_doublebuffer[20];
checksumtemp=Usart1_GetCheckSum(USART1_RX_BUF,2,8);
if(checksumtemp!=USART1_RX_BUF[10])
{
return;
}
else
{
USART1_RecCheckFrameFlag=1;
USART1_RX_STA=0;
lentemp=Uart1Read(usart1_doublebuffer,sizeof(usart1_doublebuffer));
Usart1_DoAction(usart1_doublebuffer,sizeof(usart1_doublebuffer));
}
}
void usart1_send(u8 byte)
{
USART_SendData(USART1,byte);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
}
u8 uart1SendSucAckCmd(u8 DeviceNum,u8 DeviceACKOK,u8 RetryNum,u16 timeout)
{
unsigned char csum0;
u8 i=0;
u16 count=0;
csum0=(DeviceNum+Fun_Ack+Dat_AckOK+UART1_Default_Char*5)%256;
for(i=0;i<RetryNum;i++)
{
usart1_send(UART1_Rec_Head0);
usart1_send(UART1_Rec_Head1);
usart1_send(DeviceNum);
usart1_send(Fun_Ack);
usart1_send(Dat_AckOK);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(csum0);
usart1_send(UART1_Rec_Tail0);
usart1_send(UART1_Rec_Tail1);
delay_ms(100);
}
return 1;
}
u8 uart1SendIOCmd(u8 DeviceNum,u8 sendiostatus,u8 RetryNum,u16 timeout)
{
unsigned char csum0;
u8 i=0;
u16 count=0;
USART_RecAckFlag=0;
csum0=(DeviceNum+FunIO_Sig+sendiostatus+UART1_Default_Char*5)%256;
for(i=0;i<RetryNum;i++)
{
usart1_send(UART1_Rec_Head0);
usart1_send(UART1_Rec_Head1);
usart1_send(DeviceNum);
usart1_send(FunIO_Sig);
usart1_send(sendiostatus);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(csum0);
usart1_send(UART1_Rec_Tail0);
usart1_send(UART1_Rec_Tail1);
while(USART_RecAckFlag == 0)
{
delay_ms(15);
count++;
if (count >=timeout/15)
break;
}
if (count<timeout/15)
{
return 1 ;
}
count = 0;
}
return 0;
}
u8 Uart1SendFloatDataCmd(u8 DeviceNum,u8 DevFunNum,float sendFloatdata,u8 RetryNum,u16 timeout)
{
unsigned char csum0;
u8 i=0;
u8 count=0;
USART_RecAckFlag=0;
floattemp.floatdata= sendFloatdata;
csum0=(DeviceNum+DevFunNum+floattemp.floatchararray[0]+floattemp.floatchararray[1]\
+floattemp.floatchararray[2]+floattemp.floatchararray[3]+UART1_Default_Char+UART1_Default_Char)%256;
for(i=0;i<RetryNum;i++)
{
usart1_send(UART1_Rec_Head0);
usart1_send(UART1_Rec_Head1);
usart1_send(DeviceNum);
usart1_send(DevFunNum);
usart1_send(floattemp.floatchararray[0]);
usart1_send(floattemp.floatchararray[1]);
usart1_send(floattemp.floatchararray[2]);
usart1_send(floattemp.floatchararray[3]);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(csum0);
usart1_send(UART1_Rec_Tail0);
usart1_send(UART1_Rec_Tail1);
while(USART_RecAckFlag == 0)
{
delay_ms(20);
count++;
if (count >=timeout/20)
break;
}
if (count<timeout/20)
return 1 ;
count = 0;
}
return 0;
}
u8 Uart1SendInt32DataCmd(u8 DeviceNum,u8 DevFunNum,int32_t sendint32,u8 RetryNum,u16 timeout)
{
unsigned char csum0;
u8 i=0;
u8 count=0;
USART_RecAckFlag=0;
int32temp.intdata= sendint32;
csum0=(DeviceNum+DevFunNum+int32temp.intchararray[0]+int32temp.intchararray[1]\
+int32temp.intchararray[2]+int32temp.intchararray[3]+UART1_Default_Char+UART1_Default_Char)%256;
for(i=0;i<RetryNum;i++)
{
usart1_send(UART1_Rec_Head0);
usart1_send(UART1_Rec_Head1);
usart1_send(DeviceNum);
usart1_send(DevFunNum);
usart1_send(int32temp.intchararray[0]);
usart1_send(int32temp.intchararray[1]);
usart1_send(int32temp.intchararray[2]);
usart1_send(int32temp.intchararray[3]);
usart1_send(UART1_Default_Char);
usart1_send(UART1_Default_Char);
usart1_send(csum0);
usart1_send(UART1_Rec_Tail0);
usart1_send(UART1_Rec_Tail1);
while(USART_RecAckFlag == 0)
{
delay_ms(20);
count++;
if (count >=timeout/20)
break;
}
if (count<timeout/20)
return 1;
count = 0;
}
return 0;
}
void Usart1_DoAction(unsigned char *buf, unsigned char len)
{
u8 AckResult=0;
switch(buf[2])
{
case DevMotorX:
{
switch(buf[3])
{
case FunMotorMM://mm,浮点数
floattemp.floatchararray[0]=buf[4];
floattemp.floatchararray[1]=buf[5];
floattemp.floatchararray[2]=buf[6];
floattemp.floatchararray[3]=buf[7];
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
if(AckResult==0)
{
return;
}
break;
case FunMOTORPUL://pul,整数
int32temp.intchararray[0]=buf[4];
int32temp.intchararray[1]=buf[5];
int32temp.intchararray[2]=buf[6];
int32temp.intchararray[3]=buf[7];
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
if(AckResult==0)
{
return;
}
break;
case FunMotorVELMM://mm/s,浮点数
floattemp.floatchararray[0]=buf[4];
floattemp.floatchararray[1]=buf[5];
floattemp.floatchararray[2]=buf[6];
floattemp.floatchararray[3]=buf[7];
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
if(AckResult==0)
{
return;
}
break;
case FunMotorVELPUL://pul/s,整数
int32temp.intchararray[0]=buf[4];
int32temp.intchararray[1]=buf[5];
int32temp.intchararray[2]=buf[6];
int32temp.intchararray[3]=buf[7];
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
if(AckResult==0)
{
return;
}
break;
case FunMotorDIR://整数,0
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case FunMotorRUN:
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case FunMotorSTOP:
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case Fun_Ack://收到应答信号
{
USART_RecAckFlag=1;
}
break;
default:break;
}
}
break;
case DevMotorY:
{
switch(buf[3])
{
case FunMotorMM:
break;
case FunMOTORPUL:
break;
case FunMotorVELMM:
break;
case FunMotorVELPUL:
break;
case FunMotorDIR:
break;
case FunMotorRUN:
break;
case FunMotorSTOP:
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevMotorZ:
{
switch(buf[3])
{
case FunMotorMM:
break;
case FunMOTORPUL:
break;
case FunMotorVELMM:
break;
case FunMotorVELPUL:
break;
case FunMotorDIR:
break;
case FunMotorRUN:
break;
case FunMotorSTOP:
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevMotorA:
{
switch(buf[3])
{
case FunMotorMM:
break;
case FunMOTORPUL:
break;
case FunMotorVELMM:
break;
case FunMotorVELPUL:
break;
case FunMotorDIR:
break;
case FunMotorRUN:
break;
case FunMotorSTOP:
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevMotorB:
{
switch(buf[3])
{
case FunMotorMM:
break;
case FunMOTORPUL:
break;
case FunMotorVELMM:
break;
case FunMotorVELPUL:
break;
case FunMotorDIR:
break;
case FunMotorRUN:
break;
case FunMotorSTOP:
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevMotorC:
{
switch(buf[3])
{
case FunMotorMM:
break;
case FunMOTORPUL:
break;
case FunMotorVELMM:
break;
case FunMotorVELPUL:
break;
case FunMotorDIR:
break;
case FunMotorRUN:
break;
case FunMotorSTOP:
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevXLeftLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case DatLimitSenseDown://触碰到限位开关
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevXRightLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case DatLimitSenseDown://触碰到限位开关
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevXOrigin:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case DatLimitSenseDown://触碰到限位开关
AckResult=uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,200);
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevYLeftLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevYRightLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevYOrigin:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevZLeftLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevZRightLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevZOrigin:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevALeftLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevARightLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevAOrigin:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevBLeftLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevBRightLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevBOrigin:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevCLeftLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevCRightLimit:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevCOrigin:
{
switch(buf[3])
{
case DatLimitSenseUP://没碰到开关
break;
case DatLimitSenseDown://触碰到限位开关
break;
case Fun_Ack://收到应答信号
USART_RecAckFlag=1;
break;
default:break;
}
}
break;
case DevIO_S1://D0=0x21,D1=0x22,D2=0x80,D3=0xDD/0x00,D4=0xf0/(0x00-0x01)
{
switch(buf[3])
{
case FunIO_Sig://0x00
switch(buf[4])
{
case DatIO_S1_OFF_Sig://没碰到开关
break;
case DatIO_S1_ON_Sig://触碰到限位开关
break;
default:break;
}
break;
case Fun_Ack://DD
if(buf[4]==Dat_AckOK)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,99,2);
Lcd_Clear(BLUE);
}
else if(buf[4]==Dat_AckNG)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,55,2);
Lcd_Clear(BLUE);
}
break;
default:break;
}
}
break;
case DevIO_S2:
{
switch(buf[3])
{
case FunIO_Sig://0x00
switch(buf[4])
{
case DatIO_S2_OFF_Sig://没碰到开关
break;
case DatIO_S2_ON_Sig://触碰到限位开关
break;
default:break;
}
break;
case Fun_Ack:
if(buf[4]==Dat_AckOK)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,99,2);
}
break;
default:break;
}
}
break;
case DevIO_S3:
{
switch(buf[3])
{
case FunIO_Sig://0x00
switch(buf[4])
{
case DatIO_S3_OFF_Sig://没碰到开关
break;
case DatIO_S3_ON_Sig://触碰到限位开关
break;
default:break;
}
break;
case Fun_Ack:
if(buf[4]==Dat_AckOK)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,99,2);
}
break;
default:break;
}
}
break;
case DevIO_S4:
{
switch(buf[3])
{
case FunIO_Sig://0x00
switch(buf[4])
{
case DatIO_S4_OFF_Sig://没碰到开关
break;
case DatIO_S4_ON_Sig://触碰到限位开关
break;
default:break;
}
break;
case Fun_Ack:
if(buf[4]==Dat_AckOK)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,99,2);
}
break;
default:break;
}
}
break;
case DevIO_S5:
{
switch(buf[3])
{
case FunIO_Sig://0x00
switch(buf[4])
{
case DatIO_S5_OFF_Sig://没碰到开关
break;
case DatIO_S5_ON_Sig://触碰到限位开关
break;
default:break;
}
break;
case Fun_Ack:
if(buf[4]==Dat_AckOK)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,99,2);
}
break;
default:break;
}
}
break;
case DevIO_S6:
{
switch(buf[3])
{
case FunIO_Sig://0x00
switch(buf[4])
{
case DatIO_S6_OFF_Sig://没碰到开关
break;
case DatIO_S6_ON_Sig://触碰到限位开关
break;
default:break;
}
break;
case Fun_Ack:
if(buf[4]==Dat_AckOK)
{
USART_RecAckFlag=1;
LCD_ShowNumAsc32(160,0,GREEN,WHITE,99,2);
}
break;
default:break;
}
}
break;
default:break;
}
}
main.c
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
#include "delayzd.h"
#include "usart.h"
#include "Lcd_Driver.h"
#include "stdio.h"
#include "sys.h"
int main(void)
{
u8 i = 0;
delay_init(168);
Usart1_Config(115200);
Lcd_Init();
delay_ms(20);
Lcd_Clear(BLUE);
LED_Init();
LCD_ShowCharAsc32(0,0,RED, WHITE,0x35);
LCD_ShowCharAsc32(64,0,RED, WHITE,0x22);
delay_ms(1000);
while(1)
{
uart1SendSucAckCmd(DevMotorX,Dat_AckOK,5,1000);
uart1SendIOCmd(DevIO_S1,DatIO_S1_OFF_Sig,5,2000);
delay_ms(2000);
uart1SendIOCmd(DevIO_S1,DatIO_S1_ON_Sig,5,2000);
delay_ms(2000);
Uart1SendFloatDataCmd(DevMotorX,FunMotorMM,52.65,5,2000);
Uart1SendInt32DataCmd(DevMotorX,FunMOTORPUL,1000,5,2000);
}
}
5.2上位机的串口代码
代码接收
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] Data = new byte[serialPort1.BytesToRead];
bool Rec_Flag = true;
bool UpdateData = false;
byte[] bytestemp = new byte[4];
ushort AckResult=0;
if (Data.Length < 13)
{
Rec_Flag = false;
}
if (Rec_Flag == true)
{
try
{
serialPort1.Read(Data, 0, Data.Length);
textBox15.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "收 <- ");
foreach (byte Member in Data)
{
string str = Convert.ToString(Member, 16).ToUpper();
textBox15.AppendText((str.Length == 1 ? "0" + str : str) + " ");
}
textBox15.AppendText("\r\n");
}
catch { }
if (Data.Length == 13)
{
if (Data[0] == Head[0])
{
if (Data[1] == Head[1])
{
int csum = CheckSumAction(Data, 13);
if (Data[10] == csum)
{
UpdateData = true;
}
else
{
textBox15.AppendText("\r\n和校验值错误,请检查校验算法!!\r\n");
}
}
else
return;
}
else
return;
}
else
{
textBox15.AppendText("\r\n返回的字节数不对!!\r\n");
}
if (UpdateData == true)
{
UpdateChanData(textBox1, Data, 1);
UpdateChanData(textBox2, Data, 2);
UpdateChanData(textBox3, Data, 3);
UpdateChanData(textBox4, Data, 4);
UpdateChanData(textBox5, Data, 5);
UpdateChanData(textBox6, Data, 6);
UpdateChanData(textBox7, Data, 7);
UpdateChanData(textBox8, Data, 8);
UpdateChanData(textBox9, Data, 9);
UpdateChanData(textBox10, Data, 10);
UpdateChanData(textBox11, Data, 11);
UpdateChanData(textBox12, Data, 12);
UpdateChanData(textBox13, Data, 13);
switch (Data[2])
{
case 0x00://X电机
switch (Data[3])
{
case 0x00://mm,浮点数
AckResult = SendAckToSerialPort(serialPort1,0x00,0xDD, 0xf0,5,200);
bytestemp[0] = Data[4];
bytestemp[1] = Data[5];
bytestemp[2] = Data[6];
bytestemp[3] = Data[7];
float fdata = BitConverter.ToSingle(bytestemp, 0);;
textBox16.Text = Convert.ToString(fdata);
textBox17.Text ="xxx";
textBox18.Text = "XMNC";
break;
case 0x01://pul,整数
AckResult = SendAckToSerialPort(serialPort1,0x00,0xDD, 0xf0,5,200);
bytestemp[0] = Data[4];
bytestemp[1] = Data[5];
bytestemp[2] = Data[6];
bytestemp[3] = Data[7];
Int32 intdata = BitConverter.ToInt32(bytestemp,0);
textBox16.Text = "xxx";
textBox17.Text = Convert.ToString(intdata);
textBox18.Text = "XMNC";
break;
case 0xDD://应答
Program.USART1_RecAckFlag = 1;
textBox18.Text = "XMACK";
break;
}
break;
case 0x80://第一个IO口D2=0x80,D3=0xDD/0x00,
switch (Data[3])
{
case 0x00://IO状态
if(Data[4]==0x00)
{
button17.BackColor = Color.Red;
AckResult = SendAckToSerialPort(serialPort1, 0x80, 0xDD, 0xF0,3, 1000);
}
else if(Data[4]==0x01)
{
button17.BackColor = Color.Green;
AckResult = SendAckToSerialPort(serialPort1, 0x80, 0xDD, 0xF0,3, 1000);
}
break;
case 0xDD://收到应答信号
break;
default: break;
}
break;
default:break;
}
}
}
}
代码发送应答信号
private ushort SendAckToSerialPort(SerialPort MyPort, byte DeviceNum, byte AckFunCodetemp, byte AckType, ushort retrynum, Int16 timeoutset)
{
byte csumtemp = 0x00;
int sumtemp = 0;
ushort i = 0;
Program.USART1_RecAckFlag = 0;
sumtemp = DeviceNum + AckFunCodetemp + AckType + 0x55 + 0x55 + 0x55 + 0x55 + 0x55;
csumtemp = (byte)(sumtemp % 256);
byte[] AckTempData0 = new byte [13]{0x21,0x22,DeviceNum,AckFunCodetemp, AckType, 0x55, 0x55, 0x55, 0x55, 0x55, csumtemp, 0x0D, 0x0A };
byte[] AckTempData00 = new byte[1];
AckTempData00[0] = AckTempData0[0];
byte[] AckTempData01 = new byte[1];
AckTempData01[0] = AckTempData0[1];
byte[] AckTempData02 = new byte[1];
AckTempData02[0] = AckTempData0[2];
byte[] AckTempData03 = new byte[1];
AckTempData03[0] = AckTempData0[3];
byte[] AckTempData04 = new byte[1];
AckTempData04[0] = AckTempData0[4];
byte[] AckTempData05 = new byte[1];
AckTempData05[0] = AckTempData0[5];
byte[] AckTempData06 = new byte[1];
AckTempData06[0] = AckTempData0[6];
byte[] AckTempData07 = new byte[1];
AckTempData07[0] = AckTempData0[7];
byte[] AckTempData08 = new byte[1];
AckTempData08[0] = AckTempData0[8];
byte[] AckTempData09 = new byte[1];
AckTempData09[0] = AckTempData0[9];
byte[] AckTempData10 = new byte[1];
AckTempData10[0] = AckTempData0[10];
byte[] AckTempData11 = new byte[1];
AckTempData11[0] = AckTempData0[11];
byte[] AckTempData12 = new byte[1];
AckTempData12[0] = AckTempData0[12];
ushort tt =2;
if (serialPort1.IsOpen)
{
for (i = 0; i < retrynum; i++)
{
serialPort1.Write(AckTempData00, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData01, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData02, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData03, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData04, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData05, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData06, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData07, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData08, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData09, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData10, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData11, 0, 1); System.Threading.Thread.Sleep(tt);
serialPort1.Write(AckTempData12, 0, 1); System.Threading.Thread.Sleep(tt);
}
}
return 1;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)