void RS_SendDataPack(serial_driver_t *rs, unsigned char *buf, int len) { U32 etime=GetTickCount(); DBPRINTF("485 send:%d\n",len); //// 485收发控制 低电平收,高电平发 RS485_setmode(TRUE); DelayUS(1000);// DEBUGTRACE(buf,len); // rs->write(0x88);//多发送一个字节,修正485网络干扰 rs->write_buf(buf,len); rs->tcdrain(); while(rs->get_lsr()!=TIOCSER_TEMT); //wait for the transmit shift register empty DBPRINTF("get_lsr() time:%d\n",GetTickCount()-etime); // mmsleep(3*115200/gOptions.RS232BaudRate); RS485_setmode(FALSE); }
void RS_SendDataPack(serial_driver_t *rs, unsigned char *buf, unsigned short size) { unsigned short cs; TMyBuf *packet=bget(1); PRSHeader ch=(PRSHeader)(packet->buf); memset(packet->buf, 0, sizeof(TRSHeader)); packet->len=sizeof(TRSHeader)+size; ch->HeaderTag[0]=THEDID; ch->HeaderTag[1]=THEDID; ch->Cmd=(char)CMD_RS; ch->CmdCheck=0xFF-CMD_RS; ch->Len=size; memcpy(packet->buf+sizeof(TRSHeader), buf, size); ch->CheckSum=in_chksum(packet->buf, packet->len); #ifdef MAIN_PRG if(rs==&st232) { int dd=gOptions.RS232BaudRate/10000; RS485_setmode(TRUE); if(dd>0) dd=4*115200/dd; else dd=4*115200; cs=0; while(cs<packet->len) { rs->write(packet->buf[cs++]); if(cs%256==0) { DelayUS(dd); } } rs->flush_output(); // DelayUS(3000); //for 115200 DelayUS(3000*115200/gOptions.RS232BaudRate); RS485_setmode(FALSE); } else #endif { for(cs=0;cs<packet->len;cs++) rs->write(packet->buf[cs]); rs->flush_output(); } packet->len=0; }