📄 uitransfer.c
字号:
#include <pr2k.h>
#include <TypeDefine.h>
#ifdef __WIN32__
#include <uiTransfer.h>
#include <uiUart.h>
#else
#include <uart.h>
#include <Transfer.h>
#endif
#ifndef __WIN32__
extern unsigned int gSecondTick;
#endif
// return: second
unsigned int _GetTickCount()
{
#ifndef __WIN32__
return gSecondTick;
#else
int t;
t = GetTickCount();
return t/1000;
#endif
}
// graduation of timeOut is second
DLL_EXP(int) MasterHandShake(int UartNo, short timeOut)
{
unsigned int t0, t1;
unsigned char ch;
int ret;
// rtsCh = HANDSHAKE_RTS;
// okCh = HANDSHAKE_OK;
t0 = _GetTickCount();
while(1)
{
com_SendByte(UartNo, HS_MASTER_RTS);
ret = hs_ReceiveByte(UartNo, &ch);
if((ret==STATUS_OK)&&(ch==HS_SLAVE_ACK))
{
com_SendByte(UartNo, HS_MASTER_CONFIRM);
return STATUS_OK;
}
t1 = _GetTickCount();
if(t1<t0)
break;
if((t1-t0)>timeOut)
break;
}
return HS_ERR_TIMEOUT;
}
DLL_EXP(int) SlaveHandShake(int UartNo, short timeOut)
{
unsigned int t0, t1;
unsigned char ch ;
int i, ret;
if((UartNo!=COM1)&&(UartNo!=COM2))
return HS_ERR_ARG;
t0 = _GetTickCount();
while(1)
{
ret = com_ReceiveByte(UartNo, &ch);
if((ret==STATUS_OK)&&(ch==HS_MASTER_RTS))
{
//while(1)
com_SendByte(UartNo, HS_SLAVE_ACK);
do
{
ret = com_ReceiveByte(UartNo, (unsigned char *)&ch);
}while((ret==STATUS_OK)&&(ch==HS_MASTER_RTS));
if((ret!=STATUS_OK)||(ch!=HS_MASTER_CONFIRM))
{
for(i=0; i<100; i++)
{
ret = com_ReceiveByte(UartNo, &ch);
//if(ret==STATUS_OK)
if((ret==STATUS_OK)&&(ch==HS_MASTER_CONFIRM))
break;
}
}
if((ret==STATUS_OK)&&(ch==HS_MASTER_CONFIRM))
{
return STATUS_OK;
}
else
return HS_ERR_CONFIRM;
}
t1 = _GetTickCount();
if(t1<t0)
break;
if((t1-t0)>timeOut)
break;
}
return HS_ERR_TIMEOUT;
}
int swapInt(int data)
{
int i;
char *p;
char buffer[4];
#ifdef __WIN32__
p = (char *)&data;
for(i=0; i<4; i++)
{
buffer[3-i] = p[i];
}
return *(int *)buffer;
#else
return data;
#endif
}
static unsigned int GetChecksum(unsigned char *buffer, unsigned int dataLen)
{
unsigned int i, checksum=0;
for(i=0; i<dataLen; i++)
checksum += buffer[i];
return checksum;
}
unsigned short gErrCheckNum = 0;
unsigned short gErrLenNum = 0;
unsigned short gErrBlockNum = 0;
DLL_EXP(unsigned int) ReceivePackData(int UartNo, int packetNo, unsigned char *buffer)
{
unsigned int len, readLen;
unsigned int bgChkSum, checkSum;
unsigned int swapNo, swapLen, swapChkSum;
unsigned char ack;
int no;
int i, iret, errorNum=0;
/*
TDeviceState DS;
unsigned char byTemp;
DS.BaudRate = 9600;
DS.Parity = NOPARITY;
DS.DataBits = 8;
//DS.StopBits = ONESTOPBIT;
DS.StopBits = TWOSTOPBITS;
*/
for(i=0; i<10; i++)
{
// com_Close(COM2);
// IrDA_Open("COM2", &DS);
iret = SlaveHandShake(UartNo, 50);
if(iret!=STATUS_OK)
continue;
iret = com_Receive(UartNo, (unsigned char *)&no, 4);
swapNo = swapInt(no);
if(swapNo!=packetNo)
{
ack = ACK_ERRPACKETNO;
com_Send(UartNo, (unsigned char *)&ack, 1);
//ShowString(10, 125, "receive again OK");
continue;
}
iret = com_Receive(UartNo, (unsigned char *)&len, 4);
swapLen = swapInt(len);
if(iret!=4)
{
ack = ACK_ERRLEN;
com_Send(UartNo, (unsigned char *)&ack, 1);
//ShowString(10, 125, "receive again OK");
continue;
}
readLen = com_Receive(UartNo, buffer, swapLen);
if(readLen!=swapLen)
{
ack = ACK_ERRBLOCK;
com_Send(UartNo, (unsigned char *)&ack, 1);
//ShowString(10, 125, "receive again OK");
continue;
}
iret = com_Receive(UartNo, (unsigned char *)&bgChkSum, 4);
swapChkSum = swapInt(bgChkSum);
checkSum = GetChecksum(buffer, readLen);
if(swapChkSum==checkSum)
{
ack = ACK_OK;
com_Send(UartNo, (unsigned char *)&ack, 1);
return readLen;
}
//show_unsigned(10, 128, ++errorNum, DEC);
//show_unsigned(10, 80, gUart0Error, DEC);
ack = ACK_ERRCHECKSUM;
com_Send(UartNo, (unsigned char *)&ack, 1);
//show_unsigned(10, 112, ++gErrCheckNum, HEX);
}
return 0;
}
DLL_EXP(STATUS) SendPackData(int UartNo, int packetNo, unsigned char *buffer, unsigned int len)
{
unsigned int bgLen, checkSum;
unsigned int lenSend, bgChkSum;
//int bSucc;
unsigned char ack;
int iret, i, j;
//bSucc = FAIL;
bgLen = swapInt(len);
for(i=0; i<10; i++)
{
iret = MasterHandShake(UartNo, 50);
if(iret!=STATUS_OK)
return iret;
iret = com_Send(UartNo, (unsigned char *)&packetNo, 4);
if(iret!=4)
{
//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
continue;
}
iret = com_Send(UartNo, (unsigned char *)&bgLen, 4);
if(iret!=4)
{
//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
continue;
}
lenSend = com_Send(UartNo, buffer, len);
if(lenSend!=len)
{
//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
continue;
}
checkSum = GetChecksum(buffer, lenSend);
bgChkSum = swapInt(checkSum);
iret = com_Send(UartNo, (unsigned char *)&bgChkSum, 4);
if(!iret)
{
//OpenUart(UartNo, PARITY_NONE, STOPBIT_1BIT, BAUDRATE_DEFAULT);
continue;
}
ack = 0;
for(j=0; j<10; j++)
{
iret = com_Receive(UartNo, (unsigned char *)&ack, 1);
if(iret)
break;
}
//if(iret && (ack==ACK_OK))
if(iret && (ack<0xf0))
{
return STATUS_OK;
}
}
return STATUS_ERR;
}
#ifdef BOOT_LOADER
void UartTest()
{
unsigned int count=0, i=0, data, ret, loop;
unsigned char buffer[4];
TDeviceState DS;
int row=0;
DS.BaudRate = 57600;
DS.Parity = NOPARITY;
DS.StopBits = TWOSTOPBITS;
com_Open(COM1, &DS);
//OpenUart(PARITY_NONE, STOPBIT_2BIT, 57600);
//OpenUart(COM1, PARITY_NONE, STOPBIT_1BIT, 57600);
ShowString(10, 30, "Uart Test");
/*if(HandShake(10)==FAIL) // timeout is 6 second
{
CloseUart();
ShowString(10, 100, "Fail Connect");
while(1);
}
*/
ShowString(10, 30, "Send Data...");
buffer[0]=0xff; buffer[1]=0xf8; buffer[2]=0x00; buffer[3]=0x00;
for(i=0; i<64; i++)
{
com_Send(COM1, buffer, 4);
//loop = 0x8000;
//while(loop--);
}
displayClear();
while(1)
{
if(!count)
{
ret = com_Receive(COM1, (char *)&data, 1);
count++;
}
ret = com_Receive(COM1, (char *)&data, 4);
count += ret;
if(ret<4)
{
//displayClear();
ShowString(10, 135, "total:");
show_unsigned(50, 135, count, DEC);
break;
}
if(i%2)
{
show_unsigned(85, 5+row*12, data, HEX);
row++;
}
else
show_unsigned(5, 5+row*12, data, HEX);
i++;
if(row>12)
{
row=0;
loop = 0xa000;
while(loop--);
displayClear();
}
}
//CloseUart(COM1);
com_Close(COM1);
while(1);
}
void IrDA_Test(void)
{
int loop;
TDeviceState DS;
DS.BaudRate = 9600;
DS.Parity = NOPARITY;
DS.StopBits = ONESTOPBIT;
IrDA_Open(COM2, &DS);
while(1)
{
com_SendByte(COM2, 'A');
loop = 0x1000;
while(loop--);
com_SendByte(COM2, 'B');
//loop = 0x1000;
//while(loop--);
com_SendByte(COM2, 'C');
loop = 0x1000;
while(loop--);
}
com_Close(COM2);
//CloseUart(COM1);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -