如何用API函数对串口进行文件传输?

WYJBCB 2003-11-13 11:37:41
分不够再加,能提供源码且能实现的可得100分,暂放50
...全文
44 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
crzman37 2003-12-10
  • 打赏
  • 举报
回复
bool __fastcall SCommunication::ComInitialization()
{
DCB dcb;
BOOL fSuccess;
COMMTIMEOUTS CommTimeOuts;
int BaudRateP,ByteSizeP,ParityP,StopBitsP;
AnsiString CommPort=FormMain->GetCommParameter(&BaudRateP,&ByteSizeP,&ParityP,&StopBitsP);

hCom = CreateFile(CommPort.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, //必须以opened w/exclusive-access
NULL, //无安全属性
OPEN_EXISTING, //必须用OPEN_EXISTING
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠I/O
NULL //对通信设备必须是NULL
);
if (hCom == INVALID_HANDLE_VALUE) {
// dwError = GetLastError();
MessageBox(NULL,"打开通信设备文件失败!","错误",MB_OK);
return false;
}

SetupComm(hCom,4096,4096); // 设置输入,输出缓冲区皆为4096字节

fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess) {
MessageBox(NULL,"获取通信设备控制块数据结构操作异常!","错误",MB_OK);

return false;
}

// 填充DCB: baud=9600, 8 data bits, no parity, 1 stop bit.

dcb.BaudRate = BaudRateP;
dcb.ByteSize = ByteSizeP;
dcb.Parity = ParityP;
dcb.StopBits = StopBitsP;
dcb.fDtrControl = DTR_CONTROL_ENABLE;

dcb.fInX = TRUE; //允许输入(接收)Xon/Xoff流量控制
dcb.fOutX = TRUE; //允许输出(发送)Xon/Xoff流量控制
dcb.XonLim = BLOCK_LENGTH/4; //接收时发出Xon时的门限值
dcb.XoffLim = BLOCK_LENGTH/4;//接收时发出Xoff时的门限值

//用改变后的控制(配置)块数据结构设置串行口
fSuccess = SetCommState(hCom, &dcb);
if (!fSuccess) {
MessageBox(NULL,"设置通信设备控制块数据结构操作异常!","错误",MB_OK);
return false;
}

CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 5000;

SetCommTimeouts(hCom, &CommTimeOuts);
if(!SetCommMask(hCom, EV_RXCHAR))
{
MessageBox(NULL,"设置通信设备超时数据结构操作异常!","错误",MB_OK);
return false;
}

memset(&osRead, 0, sizeof(OVERLAPPED));
memset(&osWrite, 0, sizeof(OVERLAPPED));
osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

BufferOffset=0;
LineBytes=0;
return true;

}

DWORD __fastcall SCommunication::ReadCommBlock(LPSTR lpBlock,DWORD nMaxLength)
{
BOOL fReadStat;
COMSTAT ComStat;
DWORD dwErrorFlages,dwLength;
ClearCommError(hCom,&dwErrorFlages,&ComStat);
dwLength=(((DWORD)nMaxLength<ComStat.cbInQue)?(DWORD)nMaxLength:ComStat.cbInQue);
if(dwLength>0)
{
fReadStat=ReadFile(hCom,lpBlock,dwLength,
&dwLength,&osRead);
if(!fReadStat)
{
if(GetLastError()==ERROR_IO_PENDING)
{
if(WaitForSingleObject(osRead.hEvent,1000))
dwLength=0;
else
{
GetOverlappedResult(hCom,&osRead,&dwLength,FALSE);
osRead.Offset+=dwLength;
}
}
else dwLength=0;
}
}
return dwLength;
}

BOOL __fastcall SCommunication::WriteCommBlock(LPSTR lpBlock,DWORD nMaxLength)
{
BOOL fWriteStat;
DWORD dwLineBytesWritten;
if(nMaxLength==0)return false;
for(DWORD i=0;i<nMaxLength;i++)
{
fWriteStat = WriteFile(hCom, lpBlock+i, 1, &dwLineBytesWritten, &osWrite);
if (!fWriteStat && (GetLastError() == ERROR_IO_PENDING))
{
if (WaitForSingleObject(osWrite.hEvent, 1000)) dwLineBytesWritten = 0;
else
{
GetOverlappedResult(hCom, &osWrite, &dwLineBytesWritten, FALSE);
osWrite.Offset += dwLineBytesWritten;
}
}
}
return TRUE;
}

void __fastcall SCommunication::ReadCommToBuffer(void)
{
DWORD nLength,i,j;
do
{
if((nLength=ReadCommBlock((LPSTR)(Buffer+BufferOffset),BLOCK_LENGTH))>0)
{
BufferOffset+=nLength;
}
}
while(nLength>0);

j=BufferOffset-LineBytes;
for(i=0;i<j;i++)
{
if(*(Buffer+LineBytes)==0x0a||LineBytes==LINE_LENGTH)
{
*(Buffer+LineBytes-1)=0;
CallTichetSubmit();
LineBytes++;
BufferOffset-=LineBytes;
if(BufferOffset)
memmove(Buffer,Buffer+LineBytes,BufferOffset);
LineBytes=0;
}
else LineBytes++;
}
}
pheavecn 2003-11-19
  • 打赏
  • 举报
回复
高级的必须用异步传输。
自己仔细看看与通讯有关函数的help吧。
chifengwatch 2003-11-18
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2461/2461609.xml?temp=.7759516
刚回答了一个
一般的读线程内容如下
DWORD nBytesRead, dwEvent, dwError;
char inbuff[1024];
COMSTAT cs;

if ( hComm == INVALID_HANDLE_VALUE )

{

return;

}

//取得状态

ClearCommError( hComm , &dwError , &cs );



if ( cs.cbInQue == 0 )//无数据

{

return ;

}

// 数据是否大于我们所准备的Buffer



if ( cs.cbInQue > sizeof( inbuff ) )

{

PurgeComm( hComm , PURGE_RXCLEAR ); // 清除COM 数据

return;

}



ReadFile( hComm , inbuff , cs.cbInQue , &nBytesRead , NULL ); // 接收COM 的数据

String Temp = "";
// 转移数据到变量中
inbuff[cs.cbInQue]= '\0';
for ( unsigned long i = 0 ; i <= cs.cbInQue ; i++ )
{
Temp += char(inbuff[i]);
}
frm_main->Memo1->Lines->Add( Temp ) ;


//用ClearCommError( hComm , &dwError , &cs )取得缓冲区的状态
wilsonloveada 2003-11-18
  • 打赏
  • 举报
回复
打PCOMM函数
我不懂电脑 2003-11-14
  • 打赏
  • 举报
回复
用ReadFile有专门的文章到google搜索一下。
路人丁 2003-11-14
  • 打赏
  • 举报
回复
把文件读如byte类型缓冲区然通过传口发送出去后发送出去
读入缓冲区可以采用TFielStream类来解决发送部分看:http://expert.csdn.net/Expert/topic/2381/2381132.xml?temp=.9960138
jEditor 2003-11-14
  • 打赏
  • 举报
回复
连接COM接口-----CreateFile("COM1", .....)
.........
设置COM的连接参数....
SetComm..........
连通了,就可以通讯了,这时候,把文件作为流的模式往端口
写,设备接受收到了,保存...
不可能给你原代码,你自己回去摸索摸索去..
HUANG_JH 2003-11-14
  • 打赏
  • 举报
回复
这不是2、3句话就能说明白的!

1,220

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧