#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define BUFFLEN 1024 /*定义缓冲区大小*/
#define len 50
void InitCOM(); /*PC机232串口初始化,设置波特率和缓冲区,然后打开串口开始通讯*/
void OpenPort(); /*开串口*/
void ClosePort();/*关串口*/
void send(char *);/*发送*/
void receive();/*接收*/
void covert_hex_to_binary(char *);/*十六进制转换成二进制*/
void covert_decimal_to_binary(int *);/* 十进制转二进制数 */
/*CRC校验*/
void interrupt far asyncint(); /*中断响应*/
void interrupt(*asyncoldvect)();
unsigned char Buffer[BUFFLEN]; /*定义缓冲区*/
int buffin=0;
int buffout=0;
/*--------------------------------------------------------------------------------------------------------------*/
main(int argc,char *argv[])
{
int i;
char port;/*存地址码*/
char fuction;/*存功能码*/
char reg_add_hi[2];/*存起始寄存器地址高8位*/
char reg_add_lo[2];/*存起始寄存器地址低8位*/
char reg_dat_hi[2];/*读取数据寄存器高8位*/
char reg_dat_lo[2];/*读取数据寄存器低8位*/
char port_link[2];/*用于连接命令串的地址字符*/
char fuction_link[2];/*用于连接命令串的功能字符*/
char result[12];/*用于存放各个域合成的总的串,即校验域前的几个域的集合*/
if(argc==1)
{
printf("No parameters value,please type like: Modbus [s]/[r]\n");
exit(1);
}
InitCOM();
OpenPort();
if(tolower(*argv[1])=='s')
{
{
printf(" serial port(COM1:0/COM2:1):");
port=getche();
printf("\n");
if(port=='0')
{
port_link[0]='0';
port_link[1]='0';
}
else if(port=='1')
{
port_link[0]='0';
port_link[1]='1';
}
printf(" select fuction(read:r/write:w):");
fuction=getche();
printf("\n");
if(fuction=='w')
{
fuction_link[0]='0';
fuction_link[1]='5';
}
else if(fuction=='r')
{
fuction_link[0]='0';
fuction_link[1]='3';
}
printf(" register address(high):");
for(i=0;i<2;i++)
reg_add_hi[i]=getche();
printf("\n");
printf(" register address(low):");
for(i=0;i<2;i++)
reg_add_lo[i]=getche();
printf("\n");
printf(" register data(high):");
for(i=0;i<2;i++)
reg_dat_hi[i]=getche();
printf("\n");
printf(" register data(low):");
for(i=0;i<2;i++)
reg_dat_lo[i]=getche();
printf("\n");
if(fuction=='w')
{
printf(" type the data:");
/*接收数据*/
}
else if(fuction=='r')
{
/*send();*/
}
}
/*for(i=0;i<2;i++)*/
/*printf("%c ",port_link[i]);*/
/*for(i=0;i<2;i++)*/
/*printf("%c ",fuction_link[i]);*/
/*for(i=0;i<2;i++)*/
/*printf("%c ",reg_add_hi[i]);*/
/*for(i=0;i<2;i++)*/
/*printf("%c ",reg_add_lo[i]);*/
/*for(i=0;i<2;i++)*/
/*printf("%c ",reg_cou[i]);*/
for(i=0;i<2;i++)
{
result[i]=port_link[i];
result[i+2]=fuction_link[i];
result[i+4]=reg_add_hi[i];
result[i+6]=reg_add_lo[i];
result[i+8]=reg_dat_hi[i];
result[i+10]=reg_dat_lo[i];
}
/*for(i=0;i<10;i++)*/
/*printf("%c",result[i]);*/
/* printf("\n");*/
send(result);
}
else if(tolower(*argv[1])=='r')
receive();
else
printf("No parameters value,please type like: Modbus [s]/[r]\n");
/* for(i=1;i<argc;i++)*/
/* printf("%s",argv[i]);*/
/* return 0;*/
}
/*--------------------------------------------------------------------------------------------------------------*/
void InitCOM()/*初始化COM1为0X3F8(COM2-2F8,COM3-3E8,COM4-2E8)*/
{
outportb(0x3fb,0x80);/*通訊線控制寄存器控制字,訪問波特率除數鎖存器;向0x3fb地址写0x80,outportb()管脚定义函数,0x3f9和0x3fb都是PC里负责*/
outportb(0x3f8,0x0C);/*除數鎖存器控制字低位,定波特率*/
outportb(0x3f9,0x00);/*除數鎖存器控制字高位,定波特率*/
outportb(0x3fb,0x03);
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
}
/*--------------------------------------------------------------------------------------------------------------*/
void OpenPort()
{
unsigned char ucTemp;
InitCOM();
asyncoldvect=getvect(0x0c);
disable();
inportb(0x3f8);
inportb(0x3fe);
inportb(0x3fb);
inportb(0x3fa);
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
ucTemp=inportb(0x21)&0xef;
outportb(0x21,ucTemp);
setvect(0x0c,asyncint);
enable();
}
/*--------------------------------------------------------------------------------------------------------------*/
void interrupt far asyncint()
{
Buffer[buffin++] = inportb(0x3f8);
if (buffin >= BUFFLEN)
buffin=0;
outportb(0x20,0x20);
}
/*--------------------------------------------------------------------------------------------------------------*/
void ClosePort(void)
{
disable();
outportb(0x3f9,0x00);
outportb(0x3fc,0x00);
outportb(0x21,inportb(0x21)&0x10);
enable();
setvect(0x0c,asyncoldvect);
}
/*--------------------------------------------------------------------------------------------------------------*/
void send(char *result_p)
{
int j;
unsigned int *p_crc;
for(j=0; j<12; j++)
printf("%c",*(result_p++));
printf("\n");
/* for(j=0; j<12; j++) /*以下5行都是4月12号加的*/*/
/* result_p+j=(unsigned char)(*(result_p+j));*/
p_crc=cal_crc(result_p,6);
for(j=0;j<12;j++)
printf("%d",*p_crc++);
}
/*--------------------------------------------------------------------------------------------------------------*/
void receive()
{
}
/*--------------------------------------------------------------------------------------------------------------*/
unsigned int cal_crc(unsigned char *ptr, unsigned int len)
{
unsigned int crc=0xffff;
unsigned char i;
while(len!=0)
{
crc^=*ptr;
for(i=0;i<8;i++)
{
if((crc&0x0001)==0)
crc=crc>>1;
else
{
crc=crc>>1;
crc^=0xa001;
}
}
len-=1;
ptr++;
}
return crc;
}
c语言实现 通过rs232可实现上位机和下位机的通信-Modbus
4星 · 超过85%的资源 需积分: 50 177 浏览量
2007-10-27
12:42:29
上传
评论 16
收藏 2KB RAR 举报
gxj022
- 粉丝: 116
- 资源: 30
最新资源
- 基于stm32f103c单片机+MPU6050+0.96英寸OLED显示屏双柄遥控器硬件(原理图+PCB)工程文件.zip
- 整理的关于少儿编程的学习路径,以及如何在小升初,初升高和大学充分的利用起来编程经验的优势
- 足球比赛结果统计表2006-2011年大约28W场比赛
- 基于PHP+mysql的社区交流系统(源代码)
- yolov5,SSD 可能使用到的一些代码
- 一键批量生成多层次文件夹结构,使用Python脚本实现嵌套文件夹批量生成
- 基于c51单片机+DS1302+DHT11温湿度模块+LCD1602显示的万年历硬件原理图+BOM+软件程源码序+仿真图.zip
- NSGA2的MATLAB代码
- Messagepassingtest_GCN_DGL.py
- Sh,Docker 运维好帮手,一招通过 sh 脚本批量快速启动和重启多个Docker 容器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页