社区
Windows SDK/API
帖子详情
如何用API函数对串口进行文件传输?
WYJBCB
2003-11-13 11:37:41
分不够再加,能提供源码且能实现的可得100分,暂放50
...全文
80
8
打赏
收藏
如何用API函数对串口进行文件传输?
分不够再加,能提供源码且能实现的可得100分,暂放50
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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句话就能说明白的!
PComm Lite ---- 用VC 封装
串口
通信协议 DLL
用了Pcomm lite,只需要打开
串口
,建个线程收数据,然后只需要关注自己要收发的数据就行了。 PComm Lite是家叫moxa的公司出的,做了几十年工业
串口
卡、
串口
服务器之类设备了。提供的pcomm易用性、可靠性久经考验。 下载地址:http://www.moxa.com/product/download_pcommlite_info.htm 成熟的PCOMM PRO确实好用,例子和使...
LuatOS核心库
API
——【ymodem】
文件传输
协议
摘要:LuatOS是一款轻量级嵌入式Lua开发框架,专为物联网终端设计,支持4G-Cat.1和MCU等硬件。其Ymodem协议实现通过1024字节数据块和CRC-16校验提升传输效率,适用于固件升级等场景。核心示例展示了如何使用
串口
接收文件数据,包括初始化、数据接收处理和状态反馈流程。开发文档详细说明了ymodem.create()和ymodem.receive()等关键
API
的使用方法及参数说明,为开发者提供快速开发参考。
实现Windows平台
串口
文件传输
的完整程序
串口
通信是计算机与外部设备之间
进行
数据交换的传统方式之一。它通过串行通信接口,以位为单位逐个顺序传输数据,因其结构简单、成本低廉而广泛应用于各类设备中。在
串口
通信中,确保数据传输的准确性是至关重要的。错误检测算法通过在传输的数据中加入额外信息来实现这一点,使得接收方能够检测到数据在传输过程中是否出现了错误。常见的错误检测算法包括循环冗余检验(CRC)和校验和。本章我们介绍了
串口
通信中错误检测与纠正的重要性,并详细讲解了循环冗余检验(CRC)和校验和这两种常见算法的原理及其简单实现。
基于VB的
串口
文件传输
程序设计与实现
分包算法需满足两个关键条件:所有中间包长度一致,便于接收端预测;最后一包允许短于标准长度,且标记为“结束包”。DoEventsNext iEnd Sub为使接收端能准确识别每一帧数据,必须定义统一的数据包格式。这类似于网络通信中的“帧结构”,包含同步字段、元信息与校验机制。字符名称十六进制十进制含义ENQ0x055请求通信(Enquiry)ACK0x066确认应答NAK0x1521否定应答。
Delphi
串口
文件传输
实战:基于VaComm64与X/Y/ZModem协议的完整实现
可以通过编写.dpk包来自定义组件分类。示例代码如下:requiresrtl,vcl,containsend.然后在注册过程中指定组件所属类别:beginend;修改'VaComm64'字符串即可改变组件显示分组名称。XModem 协议的标准数据包由以下字段组成:字段长度(字节)说明SOH 或 STX1起始标志符:SOH=0x01(128B),STX=0x02(1024B)1当前块编号(从 1 开始)1。
Windows SDK/API
1,222
社区成员
8,135
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章