?? ser_232.cpp
字號:
/*
LDS-1310 工裝測試程序
*/
#include "dos.h"
#include "bios.h"
#include "stdio.h"
#include "time.h"
#include "stdlib.h"
#define BASE_ADDR1 0x320 //基地址
#define BASE_ADDR2 0x340
#define BASE_ADDR3 0x240
#define BASE_ADDR4 0x380
#define RBR 0x0000
#define THR 0x0000
#define DLL 0x0000
#define DLM 0x0001
#define IER 0x0001
#define FCR 0x0002
#define IIR 0x0002
#define LCR 0x0003
#define MCR 0x0004
#define LSR 0x0005
#define MSR 0x0006
#define SCR 0x0007
#define SEND_NUM 2 //串口發送的BYTE數
#define SEND_NUM_MASTER 2
#define SEND_NUM_PC 66
#define I8259 0x21
#define T8259 0xa1
#define IRQ3 3
#define IRQ4 4
#define IRQ7 7
#define IRQ8 0
#define IRQ9 1
#define IRQ10 2
#define IRQ11 3
#define IRQ12 4
#define IRQ13 5
#define IRQ14 6
#define IRQ15 7
#ifdef __cplusplus
#define __CPPARGS...
#else
#define __CPPARGS
#endif
void all_deal();
void init_ram();
void init_int();
int read_peizhi();
void init_com_all();
void init_com1(unsigned int address_port);
void init_com_other(unsigned int address_port);
void test_send_com_all();
void interrupt test_rec_com_all(__CPPARGS);
void test_send_com1(unsigned int address_port,unsigned int port);
void test_send_com_other(unsigned int address_port,unsigned int port);
void test_rec_com1(unsigned int address_port,unsigned int port);
void test_rec_com_other(unsigned int address_port,unsigned int port);
void test_send_com_master(int address_port);
void input_master_buff();
void test_rec_all(int address_port);
void ser_232();
void RestoreCom();
void rec_other();
int com_err_time[16]; //各串口出錯次數
unsigned char peizhi[30]; //配置:1--站號,2--波特率,3--數
int state[4]; // 四個串口狀態
int send_buff_master[10]; //主485發送緩存區
int send_point_master; //主485發送指針
int send_buff[20]; //各子485發送緩存區
int send_point[16]; //各子485發送指針
int rec_point[16]; //各子485接收指針
int rec_buff[16][20]; //各子485接收緩存區
struct time tnew;
unsigned char sec_old;
int sec_task;
int station_code;
int send_code; //向各子485發送的數據
int ser_flag;
void ser_232()
{
int i,k;
unsigned char value,t,t1;
//讀配置文件
if(read_peizhi()==0) {
printf("'peizhi.txt' is not exist!");
return;
}
init_ram();
init_int();//中斷和串口初始化
value=0;
for(;;){
if(bioskey(1)){
value=bioskey(0);
if(value=='?') {
RestoreCom();
break;
}
}
enable();
gettime(&tnew);
if(tnew.ti_hund!=sec_old){
sec_old=tnew.ti_hund;
sec_task++;
}
if(sec_task>=10){ // 1秒任務
sec_task=0;
input_master_buff(); //填主485緩存區
}
test_send_com_master(0x320); //發送主485緩存區數據
test_send_com_all(); //測試發送各串口數據
// rec_other();
}
}
void interrupt (*oldintcom0)(__CPPARGS);
void interrupt (*oldintcom1)(__CPPARGS);
void interrupt (*oldintcom2)(__CPPARGS);
void interrupt (*oldintcom3)(__CPPARGS);
//中斷初始化
void init_int()
{
int i;
unsigned char en;
unsigned char MIRQ[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ;
//第一塊 串口IRQ3
// en=inp(I8259);
// en |=~MIRQ[IRQ3];
delay(1);
disable();
oldintcom0 = _dos_getvect(0x0b);
_dos_setvect(0x0b,test_rec_com_all);
en = inp(I8259);
en &= MIRQ[IRQ3];
outp(I8259,en);
//第二塊 串口IRQ4
// en=inp(I8259);
// en |=~MIRQ[IRQ4];
delay(1);
oldintcom1 = _dos_getvect(0x0c);
_dos_setvect(0x0c,test_rec_com_all);
en = inp(I8259);
en &= MIRQ[IRQ4];
outp(I8259,en);
//第三塊 串口IRQ7
// en = inp(I8259);
// en |= ~MIRQ[IRQ7];
delay(1);
oldintcom2 = _dos_getvect(0x0f);
_dos_setvect(0x0f,test_rec_com_all);
en = inp(I8259);
en &= MIRQ[IRQ7];
outp(I8259,en);
//第四塊 串口IRQ12
// en = inp(T8259);
// en |= ~MIRQ[IRQ12];
delay(1);
oldintcom3 = _dos_getvect(0x74);
_dos_setvect(0x74,test_rec_com_all);
en = inp(T8259);
en &= MIRQ[IRQ12];
outp(T8259,en);
init_com_all();
enable();
}
//恢復串口原中斷向量
void RestoreCom()
{
disable();
_dos_setvect(0x0b,oldintcom0);
_dos_setvect(0x0c,oldintcom1);
_dos_setvect(0x0f,oldintcom2);
_dos_setvect(0x74,oldintcom3);
enable();
}
//初始化
void init_ram()
{
int i;
for(i=0;i<4;i++){
state[i]=0;
}
for(i=0;i<16;i++){
send_point[i]=0; //各CPU發送指針
}
send_buff[0]=0; //串口號
send_buff[1]=1; //發送數據
station_code=1;
send_code=0x10;
ser_flag=0;
input_master_buff();
}
//填主485發送緩存區
void input_master_buff()
{
int i,j;
//接收站號與發送站號是否相同,接收數據與發送數據是否相同,
if((rec_buff[0][0]==station_code)&&(rec_buff[0][1]==send_code)){
printf("OK MASTER REC_STATION%d=%x,",station_code,rec_buff[0][0]); //打印接收字符
printf("%x",rec_buff[0][1]);
printf(" error=%x",com_err_time[station_code]);
printf("\n");
printf("\n");
}
else{ //有一個不等則出錯
if(ser_flag!=0){
printf("Err MASTER REC_STATION%d=",station_code);
for(i=0;i<rec_point[0];i++){
printf("%x,",rec_buff[0][i]);
}
com_err_time[station_code]++; //相應串口接收出錯次數+1
printf(" error=%x",com_err_time[station_code]);
printf("\n");
printf("\n");
}
}
ser_flag=0xaa;
station_code++; //站號+1
if(station_code>=4){ //>串口總數,站號=2
station_code=1;
send_code++;
if(send_code>=0xf0) send_code=0x10;
for(i=0;i<16;i++){ //清各從485接收緩存區
for(j=0;j<3;j++){
rec_buff[i][j]=0xff;
}
}
}
send_buff_master[0]=station_code; //填發送站號
send_buff_master[1]=send_code; //填發送碼值
send_point_master=0; //清主485發送指針
for(i=0;i<16;i++){ //清各從485接收指針
rec_point[i]=0;
}
for(i=0;i<16;i++){ //清各從485發送指針
send_point[i]=0xff;
}
}
//功能:讀配置
//返回:=1讀成功 =0讀失敗
int read_peizhi()
{
FILE *fp;
unsigned char buffer[30];
int i,k;
fp=fopen("peizhi.txt","rb");
if(fp!=NULL){
//獲得文件名
fgets(buffer,10,fp);
k=0;
peizhi[0]=0; //站號
for(i=0;i<10;i++){
if((buffer[i]>=0x30)&&(buffer[i]<0x3a)){
peizhi[0]=peizhi[0]*10+(buffer[i] & 0x0f);
k++;
}
else{
if(k>=1) break;
}
}
fgets(buffer,10,fp);
k=0;
peizhi[1]=0; //波特率
for(i=0;i<10;i++){
if((buffer[i]>=0x30)&&(buffer[i]<0x3a)){
peizhi[1]=peizhi[1]*10+(buffer[i] & 0x0f);
k++;
}
else{
if(k>=1) break;
}
}
fgets(buffer,10,fp);
k=0;
peizhi[2]=0; //四串口卡的個數
for(i=0;i<10;i++){
if((buffer[i]>=0x30)&&(buffer[i]<0x3a)){
peizhi[2]=peizhi[2]*10+(buffer[i] & 0x0f);
k++;
}
else{
if(k>=1) break;
}
}
fgets(buffer,10,fp);
k=0;
peizhi[3]=0; //以太個數
for(i=0;i<10;i++){
if((buffer[i]>=0x30)&&(buffer[i]<0x3a)){
peizhi[3]=peizhi[3]*10+(buffer[i] & 0x0f);
k++;
}
else{
if(k>=1) break;
}
}
fgets(buffer,10,fp);
k=0;
peizhi[4]=0; //以太個數
for(i=0;i<10;i++){
if((buffer[i]>=0x30)&&(buffer[i]<0x3a)){
peizhi[4]=peizhi[4]*10+(buffer[i] & 0x0f);
k++;
}
else{
if(k>=1) break;
}
}
fclose(fp);
if((peizhi[1]>12) || (peizhi[1]<1)) peizhi[1]=3; //波特率超范圍
return 1;
}
else{ //讀配置文件出錯
return 0;
}
}
//初始化各串
void init_com_all()
{
state[0]=0xaa; //置投運標志
init_com1(0x320); //初始化第一犻串口
}
/*baud,8,無,1*/
/*address_port--地址 */
void init_com1(unsigned int address_port)
{
int baud,i,t1;
int value;
baud=0x180;
for(i=0;i<peizhi[1]-1;i++){
baud=baud/2;
}
/*串0--4800 8 none 1*/
value=0x83;
outportb(address_port+LCR,value);
value=baud%0x100;
outportb(address_port+DLL,value);
value=baud/0x100;
outportb(address_port+DLM,value);
value=0x03;
outportb(address_port+LCR,value);
// outportb(address_port+IIR,0xff);
outportb(address_port+MCR,0x08);
value=0x01;
outportb(address_port+IER,value); //允許接受中斷
/*其它三個串 */
for(i=1;i<4;i++){
value=0x83;
outportb(address_port+i*8+LCR,value);
value=baud%0x100;
outportb(address_port+i*8+DLL,value);
value=baud/0x100;
outportb(address_port+i*8+DLM,value);
value=0x03;
outportb(address_port+i*8+LCR,value);
// outportb(address_port+i*8+IIR,0x01);
outportb(address_port+i*8+MCR,0x08);
value=0x01;
outportb(address_port+i*8+IER,value); //允許接受中斷
}
}
//主485發送程序
void test_send_com_master(int address_port)
{
int t,aa,i,t1;
if(send_point_master<SEND_NUM_MASTER){ //判斷是否發送完畢
t=inport(address_port+LSR);
if((t& 0x20)==0x20){
aa=send_buff_master[send_point_master];
outp(address_port+THR,aa&0xff);
if(send_point_master==0){
printf("If you input'?',Quit\n");
printf("Mastersend="); //顯示發送字符
for(i=0;i<SEND_NUM_MASTER;i++){
printf("%x,",send_buff_master[i]);
}
printf("\n"); //一個命令發送完
}
send_point_master++; //發送指針+1
}
}
}
//各從485發送程序
void test_send_com_all()
{
test_send_com1(BASE_ADDR1,0); //串口一發送程序
}
//address_port--口地址,port--口號
void test_send_com1(unsigned int address_port,unsigned int port)
{
int t,i,j;
int aa;
for(i=1;i<4;i++){
if(send_point[4*port+i]<SEND_NUM){
rec_point[4*port+i]=0;
t=inport(address_port+i*8+LSR);
if((t& 0x20)==0x20){
aa=rec_buff[4*port+i][send_point[4*port+i]];
send_point[4*port+i]++; //發送指針+1
outp(address_port+i*8+THR,aa);
if(send_point[4*port+i]==SEND_NUM){
printf("station%d send=",4*port+i); //顯示發送字符
for(j=0;j<SEND_NUM;j++) printf("%x,",rec_buff[4*port+i][j]); //顯示發送字符
printf("\n");
}
}
}
}
}
//各串口接收程序
void interrupt test_rec_com_all (__CPPARGS)
{
disable();
test_rec_all(BASE_ADDR1); //主485接收程序
test_rec_com1(BASE_ADDR1,0); //串口一從485接收程序
rec_other();
outp(0x20,0x20); // 串口中斷結束
outp(0xa0,0x20);
enable();
}
//主485接收程序
void test_rec_all(int address_port)
{
int t;
int aa;
t=inport(address_port+LSR);
if((t & 01)){
aa=inport(address_port+RBR) & 0xff;
if(aa>0xf0) return;
rec_buff[0][rec_point[0]]=aa;
rec_point[0]++;
}
}
//串口一從485接收程序
// 輸入:address_port--口起始地址,port--串口號
void test_rec_com1(unsigned int address_port,unsigned int port)
{
int i,t;
int aa;
for(i=1;i<4;i++){
t=inport(address_port+8*i+LSR);
if((t & 01)){
aa=inport(address_port+8*i+RBR)&0xff;
if(aa>0xf0) continue;
if(rec_point[4*port+i]==0){
if(aa!=(4*port+i)){
continue;
}
}
rec_buff[4*port+i][rec_point[4*port+i]]=aa;
rec_point[4*port+i]++;
if(rec_point[4*port+i]>=SEND_NUM_MASTER){
send_point[4*port+i]=0;
}
}
}
}
void rec_other() //對硬中斷時沒有響應的采用掃描方式(軟中斷)接收。
{int i0,i1,i2,i3;
i0=inport(0x320+LSR)&0x01;
i1=inport(0x328+LSR)&0x01;
i2=inport(0x330+LSR)&0x01;
i3=inport(0x338+LSR)&0x01;
if(i0||i1||i2||i3)
test_rec_com_all();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -