📄 rs232_1.c
字号:
#include "KeyCode.h"
#include "menudat.h"
#include "ASMbasic.h"
#include "MyProcess.h"
#include "SecondRev.h"
#include "screen.h"
#include "menu.h"
#include "SPI.h"
extern volatile unsigned char kscan2;
//@extern unsigned int rd_st_com;
/*
static unsigned int rs232_header[]=
{
0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, //起始帧
0x00, //通道类型*
0x00, //垂直偏转系数*
150, //位移电压*
0x03, //随机起始地址*
0xe8, //
0x00, //是否反相*
0x00, //扫描时基*
0x01, //触发点水平位置光标*
0x90,//index1
0x00,//是否为Scan*
0x00,//index0
0xff//index
};
*/
#ifndef rs232_header
extern unsigned int *puiglBuffer;
#define rs232_header puiglBuffer
static void GetRS232Head(int *k)
{
//自定义帧前导字符
rs232_header[0]=0xaa;
rs232_header[1]=0x55;
rs232_header[2]=0xaa;
rs232_header[3]=0x55;
rs232_header[4]=0xaa;
rs232_header[5]=0x55;
//通道类型
rs232_header[6]=GetStatus(UTIL_MENU, MENUITEM1);
//垂直偏转系数
rs232_header[7]=Y_range[rs232_header[6]].Vallevel;
//位移电压
rs232_header[8]=offset0[rs232_header[6]]+12;
//随机档位下进行抽点的数据起始地址
rs232_header[9]=0x8002;//@rd_st_com-0x8002;
rs232_header[10]=rs232_header[9]>>8;
//是否反相
rs232_header[11]=GetStatus(rs232_header[6], MENUITEM5);
//扫描时基
rs232_header[12]=X_range[0].Vallevel;
//触发点水平位置光标
rs232_header[13]=T_range[rs232_header[6]].Vallevel<=0?0:T_range[rs232_header[6]].Vallevel;
//
rs232_header[14]=0;//index1>=226?0:1;
rs232_header[16]=0;
//是否为Scan
if (ISSCANLEV)
{
rs232_header[15]=1;
if (NOTISAUTO)
rs232_header[16]=1;
}
else
rs232_header[15]=0;
//
rs232_header[17]=0;//index;
*k=18;
}
static unsigned int *GetRS232Data(int *y)
{
unsigned int *buffer;
//asm(" rsbx XF");
if (!(ISSCANLEV && ISAUTO))
{//在非SCAN方式下
port22=2+GetStatus(UTIL_MENU, MENUITEM1);
Delay();
buffer=(unsigned int *)0x8002;
}
else
{//SCAN档位下
port22=0;
buffer=(unsigned int *)0xea00+GetStatus(UTIL_MENU, MENUITEM1)*0x200;
}
if (ISRANDLEV)
*y=RANDBURST*RANDLENGTH;
else if (!ISSCANLEV)
*y=2500;
else if (ISAUTO)
*y=250;
else
*y=SCANNDEPTH*100;
return buffer;
}
static void TxReady()
{
int j;
unsigned int temp;
//Maxim3111的Transmitter准备好?
do
{
//McBSP的Transmitter准备好?
do
{
j=IsTReady();
} while (j!=2);
DXR12=0;
for (j=0; j<1000; j++)
Delay();
temp=DRR12;
temp&=0x4000;
} while (temp==0);
//McBSP的Transmitter准备好?
do
{
j=IsTReady();
} while (j!=2);
}
static void Transmitter()
{
int i, j, k;
unsigned int temp;
unsigned int *ptr;
//由于RS232数据传输是经过了McBSP->Maxim3111->RS232过程,
//若以查询方式来传送数据会不稳定,因为数据在McBSP和Maxim3111中的
//Transmitter必须都准备好,并且对Maxim3111而言,其READY状态的查询都
//必须向其发送数据来或取;提高波特率可以改善其稳定性,缩短DSP的等待时间.
//帧数据信息部分
GetRS232Head(&k);
for (i=0; i<k; i++)
{
//Ready?
TxReady();
//传输数据
DXR12=0x8000 | (rs232_header[i]&0x00ff);
for (j=0; j<1000; j++)
Delay();
temp=DRR12;
//必要的等待时间
for (j=0; j<1000; j++)
Delay();
}
//帧数据部分
ptr=GetRS232Data(&k);
for (i=0; i<k; i++)
{
//Ready?
TxReady();
//数据传输
temp=ptr[i];
temp&=0x00ff;
DXR12=0x8000 |temp;
for (j=0; j<1000; j++)
Delay();
temp=DRR12;
//必要的等待时间
for (j=0; j<1000; j++)
Delay();
//按键退出判别
asm(" intr 16");
asm(" ssbx INTM");
if (kscan2==KC_CH1) return;
}
}
void DoRS232()
{
FillRect(0, 0, 240, 320, 1, 1);
RS232Info(0);
//禁止dog
DISWATCHDOG;
while (1)
{
if (ISKEY(KC_CH1))
{
//Maxim_init();
return;
}
else if (ISKEY(KC_CH2)) //开始数据传送
{
kscan2=0;
break;
}
}
//使能dog
ENWATCHDOG;
RS232Info(1);
//禁止dog
DISWATCHDOG;
asm(" ssbx INTM");
Transmitter();
asm(" rsbx INTM");
//使能dog
ENWATCHDOG;
RS232Info(2);
//禁止dog
DISWATCHDOG;
do;while(kscan2!=KC_CH1);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -