comm.c
来自「这是用C8051F020单片机实现双串口通信功能的源代码。两个串口可以同时独立收」· C语言 代码 · 共 761 行 · 第 1/3 页
C
761 行
/****************************串口通信部分程序*******************************/
/****************************485通信波特率由定时器2设置*********************/
/*****************由定时器1形成专门供通信的中断程序*************************/
/****************************串口通信部分程序*******************************/
/****************************485通信波特率由定时器2设置*********************/
/*****************由定时器1形成专门供通信的中断程序*************************/
/*注意:在中斷中需要注意*/
#include <c8051f020.h>
#include <GMUDef.h>
#define _COMM_DATA_
#include <Comm.h>
#define READ_REGISTER 0x03 //读寄存器命令
#define WRITE_REGISTER 0x10 //写寄存器命令
#define CORRECT 1 //正确
#define FAULT 0 //错误
#define BAD_COMMAND 0xff //接收到错误的命令
//定义读写控制寄存器
extern xdata union { unsigned char Chr[2];unsigned int IntData;} CommStation_save;//子站地址
extern xdata unsigned char CommStation;
extern xdata unsigned char baud_num[2];
//extern xdata unsigned char key_read_register; //度键盘的寄存器
//extern xdata unsigned char e485n_write_register; //写控制信号的寄存器
//extern xdata unsigned char dir_write_register; //写控制信号的寄存器
extern xdata unsigned char RamFlag;
extern xdata unsigned char baut_num; //波特率的计数器:1表示9600,2表示4800,3表示2400,4表示1200
//以下为定义的函数原型
void receive_data_process(void);
void receive_data_process_add(void);
void receive_crc_process(void);
void receive_crc_process_add(void);
void send_data_process(void);
void send_data_process_add(void);
void send_crc_process(void);
void send_crc_process_add(void);
void TimeOver_Handle(void);
void TimeOver_Handle_add(void);
unsigned int CRC16(unsigned char *msg,unsigned char len);
void Comm_Init_Over_Time(void);
//通信部分的主程序
Comm_Main()
{
//以下为发送部分
if(receive_all_over_flag==1) { /* 如果主控制器发来的数据已经接收完毕,将数据回应的标志置位 */
over_time_num++;
if(over_time_num>=1000){ //如果0.5秒都没有回答完毕,则说明有问题,通信复位
over_time_num=0;
TimeOver_Handle();
}
else{
if(TI0==1){
TI0=0;
if(CommCommand==READ_REGISTER){
/* if(comm_start_register_addr_error_flag==1){ //开始地址非法的处理
if(TmpCommChr==5){
TimeOver_Handle();
}
else
if((TmpCommChr>2)&&(TmpCommChr<5)){
send_crc_process();
}
else
if(TmpCommChr==2){
comm_time_over_num=0;
SBUF0=0xaa;
CommBuf[TmpCommChr]=0xaa;
TmpCommChr++;
}
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
}
else
if(comm_register_num_error_flag==1) //寄存器个数非法的处理
if(TmpCommChr==5){
TimeOver_Handle();
else
if((TmpCommChr>2)&&(TmpCommChr<5)){
send_crc_process();
}
else
if(TmpCommChr==2){
comm_time_over_num=0;
SBUF0=0xbb;
CommBuf[TmpCommChr]=0xbb;
TmpCommChr++;
}
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
}
else*/
if((comm_start_register_addr_error_flag==0)&&(comm_register_num_error_flag==0)){//正常报文处理
if(TmpCommChr-send_size_num==5){
TimeOver_Handle();
}
else
if((TmpCommChr<send_size_num+5)&&(TmpCommChr>=send_size_num+3))
send_crc_process();
else
if((TmpCommChr<send_size_num+3)&&(TmpCommChr>1))
send_data_process();
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
}
else
TimeOver_Handle();
}
else
if(CommCommand==WRITE_REGISTER){
/* if(comm_start_register_addr_error_flag==1){
if(TmpCommChr==5){ //开始地址非法的处理
TimeOver_Handle();
}
else
if((TmpCommChr>2)&&(TmpCommChr<5)) //开始地址非法的处理
send_crc_process();
else
if(TmpCommChr==2){ //开始地址非法的处理
comm_time_over_num=0;
SBUF0=0xaa;
CommBuf[TmpCommChr]=0xaa;
TmpCommChr++;
}
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
}
else
if(comm_register_num_error_flag==1){
if(TmpCommChr==5) //寄存器个数非法的处理
TimeOver_Handle();
else
if((TmpCommChr>2)&&(TmpCommChr<5)) //寄存器个数非法的处理
send_crc_process();
else
if(TmpCommChr==2){ //寄存器个数非法的处理
comm_time_over_num=0;
SBUF0=0xbb;
CommBuf[TmpCommChr]=0xbb;
TmpCommChr++;
}
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
}
else*/
if((comm_start_register_addr_error_flag==0)&&(comm_register_num_error_flag==0)){//正常报文处理
if(TmpCommChr==8){
TimeOver_Handle();
comm_over_and_change_value_start=1;//一次写寄存器通信完成,在主循环中响应的标志
}
else
if((TmpCommChr==6)||(TmpCommChr==7))
send_crc_process();
else
if((TmpCommChr>1)&&(TmpCommChr<6))
send_data_process();
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
}
else
TimeOver_Handle();
}
else{
comm_time_over_num++; //超时处理开始
if(comm_time_over_num>=20)
TimeOver_Handle();
}
if(TmpCommChr==1){
comm_time_over_num=0;
SBUF0=CommCommand;
CommBuf[1]=CommCommand;
TmpCommChr=2;
send_register_num_over_flag=0;
ii=1;
jj=0;
}
}
if(TmpCommChr==0){
comm_time_over_num=0;
SBUF0=CommStation;
CommBuf[TmpCommChr]=CommStation;
TmpCommChr=1;
}
}
}
//以下为接收部分
else{ /*如果还没有接收完主控制器发来的数据*/
if(TI0==1)
TI0=0;
if(receive_addr_over_flag==1){
if(receive_command_over_flag==1){
if(receive_start_register_addr_over_flag==1){
if(receive_register_num_over_flag==1){
if(receive_data_over_flag==1){
if(receive_crc_over_flag==1&&CRC_flag==CORRECT){
// P4&=~0x10;//不选中RAM,即IO_CS=0;
// e485n_write_register=0xff;//485EN=1;变换为写
// P4|=0x10;//选中RAM,即IO_CS=1;
ENABLE_485_WRITE1
receive_to_send_num++;
if(receive_to_send_num>=50){//转至发送状态
receive_all_over_flag=1;
receive_to_send_num=0;
receive_crc_over_flag=0;
receive_data_over_flag=0;
receive_size_num_over_flag=0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?