⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 初始化.c

📁 大延东辉系列仪表串行通讯协议为多种仪表所兼容,此代码包是测试例程,稍加修改即可使用到具体数据采集应用中去.
💻 C
字号:
//串行口COM1、COM3 中断接收 bc4.51
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define TXD 0
#define RXD 0
#define LSB 0
#define MSB 1
#define IER 1
#define IIR 2
#define LCR 3
#define MCR 4
#define LSR 5
#define MSR 6
static int inptr=0,flag=0;
static int buffer[100],get_data[100];
int com,dataa[6],com_ctrl;
int i,temp;
int baud;
char yes;
void set_com_open(int x);
void set_com_close(void);
void send_read(void);
void send_init_w();
void send(int k);
int conv( int data1, int data2);
void read_block();
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt handler(__CPPARGS);
main()
{
printf("配置PC机串口COM1(3F8),COM3(3E8) 波特率9600!!\n");
printf("串口号(1/3):");scanf("%d",&com);
if(com==1)com=0x3F8; /* PC机串行口地址 */
if(com==3)com=0x3E8;
printf("com=%x 波特率1(9600)/2(4800)/3(2400)/4(1200):",com);
scanf("%d",&baud);
set_com_open(baud);
do
{
for(i=0;i<100;i++)buffer[i]=0x00;
inptr=0;
printf("读(1)/写(2):");
scanf("%d",&com_ctrl);
switch(com_ctrl)
{
case 1: send_read();
read_block();
break;
case 2:
send_init_w();
read_block();
break;
}
gotoxy(1,25); printf( "继续/中断(y/n):"); yes='Y'; yes=getch();
if(yes!='N'|yes!='n')clrscr();
}
while((yes!='N')&&(yes!='n'));
set_com_close();
}
void send_read(void)
{
dataa[0]=0xaa;
dataa[2]=0xa0;
dataa[3]=0x00;
dataa[4]=0x00;
printf("请输入:下位机地址\n");
scanf("%d",&temp);
dataa[1]=temp;
dataa[5]=(dataa[0]+dataa[1]+dataa[2])&0x00ff;
for(i=0;i<6;i++)
{
printf("send_data[%d]=%x\n",i,dataa[i]);
send(dataa[i]);
}
}
void send(int k) /*发送一字节子程序*/
{
while((inportb(com+LSR)&0x60)!=0x60); /*判断发送寄存器空*/
outportb(com+TXD,k&0x00ff);
}
void set_com_open(int x)
{
disable();
outportb(com+LCR,0x80);
switch(x)
{
case 1:{outportb(com+LSB,0x0c);outportb(com+MSB,0x00);}break;
case 2:{outportb(com+LSB,0x18);outportb(com+MSB,0x00);}break;
case 3:{outportb(com+LSB,0x30);outportb(com+MSB,0x00);}break;
case 4:{outportb(com+LSB,0x60);outportb(com+MSB,0x00);}break;
default:{outportb(com+LSB,0x0c);outportb(com+MSB,0x00);};
}
outportb(com+MSB,0x00);
outportb(com+LCR,0x03);
outportb(com+MCR,0x0b);
oldhandler=getvect(0x0C); //****外部中断4 3 0X0b
setvect(0x0C,handler); //****
inportb(com+TXD);
outportb(com+IER,0X01);
//**** 11101111 IRQ4
outportb(0x21,inportb(0x21)&0xef);
enable();
}
void interrupt handler(__CPPARGS)
{
buffer[inptr]=inportb(com+RXD);
flag++;
disable();
inptr=(inptr+1)%100;
enable();
outportb(0x20,0x20);
}
void set_com_close(void)
{
outportb(com+MCR,0X08);
outportb(com+MCR,0X00);
outportb(0x21,0x10|inportb(0x21));//***00010000 IRQ4
setvect(0x0c,handler);
}
int conv( int data1, int data2) /*接收的原码两字节转化成c语言整型数*/
{ int a,b;
a=data1<<8;
a=a&0x7f00;
b=data2&0x00ff;
a=a+b;
b=data1&0x0080;
if(b==128) a=-1*a;
return(a);
}
void read_block()
{
delay(650);
if(buffer[0]!=0xac)return;
for(i=0;i<=buffer[2]+3;i++)
printf("buffer[%d]=%X ",i,buffer[i]);
getch(); printf("\n");
for(i=0;i<buffer[2]/2;i++)
printf("buffer[%d]=%d\n",i,conv(buffer[i*2+3],buffer[i*2+4]));
getch();
}
void send_init_w()
{
dataa[0]=0xaa;
dataa[5]=0xaa;
for(i=1;i<5;i++){dataa[i]=0;}
printf("请输入:\n 地址 参数地址 参数数据\n");
scanf("%d",&temp); //得到地址
dataa[1]=temp;
scanf("%d",&temp); //参数地址
dataa[2]=temp|0x20; /*命令字bit7=1 + 地址*/
scanf("%d",&temp); //参数数据
dataa[3]=(temp&0xFF00)>>8;
dataa[4]=temp&0x00ff;
dataa[5]=(dataa[1]+dataa[2]+dataa[3]+dataa[4]+dataa[0])&0x00ff;
for(i=0;i<6;i++)
send(dataa[i]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -