黄金会员
主题
帖子
积分8515
阅读权限40
注册时间2011-10-27
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2012-4-29 23:10
|
显示全部楼层
下位机通讯部分代码
- void UART_Send_Command1(void)
- {
- /*
- 功能:向串口发送命令
- 命令格式 0xFF 0x55 (数据长度) (命令ID) 数据
- */
- UartInit();
- UART_SendByte(0xff);
- UART_SendByte(0x55);
- UART_SendByte(0xe);
- UART_SendByte(0xff);
- UART_SendBuf( (unsigned char *)&ADCResult, 2); //AD返回值
- UART_SendBuf( (unsigned char *)&temper, 2); //当前温度值
- UART_SendByte( high_time); //加热时间
- UART_SendByte( max_time);
- UART_SendBuf( (unsigned char *)&pTerm, 2);
- UART_SendBuf( (unsigned char *)&iTerm, 2);
- UART_SendBuf( (unsigned char *)&dTerm, 2);
- UART_SendBuf( (unsigned char *)&drive, 2);
- }
- void UART_Send_Command2(void)
- {
- //加热停止
- UartInit();
- UART_SendByte(0xff);
- UART_SendByte(0x55);
- UART_SendByte(0); //数据大小
- UART_SendByte(2); //命令ID
- }
- void UART_Recv_Command(void)
- {
- /*功能; 执行串口相关命令
- 接收命令格式定义 0xFF 0x55 (命令ID) 数据
- */
- //unsigned char buf[3];
- //串口初始化
- UartInit();
- UART_RecvBuf( (unsigned char*)&ADCResult, 2);
- //检测命令头 FF 55 00 00 ... 55 FF
- //if (!((buf[0] == 0xFF) && (buf[1] == 0x55)))
- //{
- // //命令头错误
- // return;
- //}
- if ( ADCResult != 0xFF55)
- return;
- UART_RecvBuf( &max_time, 1);
- switch ( max_time)
- {
- case 0: //开始加热
- //系统参数
- UART_RecvBuf( (unsigned char *)&config, sizeof(SysConfig));
- UART_RecvBuf( (unsigned char *)&set_temper, 2);
- set_temper = set_temper * 10 + 5; //设定温度 将温度单位扩大十倍后取中间值 相当于浮点数 例如 设定300度为300.5度
- //初始化参数
- //AD相关
- //ad_zeroValueFix = config.ad_zeroValueFix; //AD调零值 用于在单电源情况下将ad输出调0
- //ad_voltageScale = config.ad_voltageScale; //AD值到电压值比例 单位uv的1/1000
- //温度相关
- //set_temper = config.set_temper * 10 + 5; //设定温度 将温度单位扩大十倍后取中间值 相当于浮点数 例如 设定300度为300.5度
- //ref_temper_voltage = TemperatureToVoltage( config.ref_temper); //热电偶 参考端(冷端)温度 电压值 uv
- //PID参数
- //pGain = config.pGain; // proportional gain
- //iGain = config.iGain; // integral gain
- //dGain = config.dGain; // derivative gain
- EA = 0;
- //擦除扇区
- IAPCommand( IAP_SECTOR_ERASE, IAP_ADDRESS, 0); //第一扇区
- //写入数据
- IAPBufCommand(IAP_BYTE_PROGRAM, IAP_ADDRESS, (unsigned char *)&config, sizeof(SysConfig)); //系统参数
- //历史温度列表
- ADCResult = 200;
- for(count=0; count<10; count++)
- {
- IAPBufCommand(IAP_BYTE_PROGRAM, IAP_ADDRESS + 0x100 + (count*2), (unsigned char *)&ADCResult, 2);
- ADCResult = ADCResult + 20;
- }
- //验证写入数据
- IAPBufCommand(IAP_BYTE_READ, IAP_ADDRESS, (unsigned char *)&config, sizeof(SysConfig)); //系统参数
- EA = 1;
- //将eeprom写入数据读取回来并发回
- UART_SendByte(0xff);
- UART_SendByte(0x55);
- UART_SendByte(sizeof(SysConfig)+2); //数据大小
- UART_SendByte(0); //命令ID 确认加热
- UART_SendBuf((unsigned char *)&config, sizeof(SysConfig));
- UART_SendBuf( (unsigned char *)&set_temper, 2);
- StartWork();
- break;
- }
- }
复制代码
提交数据由UART_Send_Command1完成
UART_Recv_Command用来接收上位机命令
这是最新12bit版本的通讯部分
看协议就可以了, 串口处理很蹩脚, 104e没有硬件波特率发生器... AD和串口公用一个定时器, 只能来回切换. |
|