社区
Windows SDK/API
帖子详情
如何用API函数对串口进行文件传输?
WYJBCB
2003-11-13 11:37:41
分不够再加,能提供源码且能实现的可得100分,暂放50
...全文
44
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句话就能说明白的!
VC++
串口
传输
API
函数
实现
利用
API
函数
显示,计算机与外围设备的
串口
通信!!!
基于
API
函数
的
串口
通信编程
基于
API
函数
的
串口
通信编程 用
API
函数
实现
串口
通信发送以及接收数据的例子
VC
串口
通讯用
API
函数
源代码
使用
API
函数
实现
串口
通讯,通过具体CSerial类实现,自己也使用了没问题
API
.rar_
API
串口
助手_
API
串口
_
串口
文件 传输_
串口
文件传输
_
串口
通信
API
APi
实现
串口
通信助手的功能,实现两个
串口
之间的字符传出和
文件传输
以及保存等功能
VC使用
API
函数
进行
串口
编程说明
通过讲述串行通信原理并用VC调用windows 32
API
函数
举例
Windows SDK/API
1,220
社区成员
8,135
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章