请高手翻译这段C程序为delphi可以用spcomm等控件

whitehare whitehare 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
#define SBUF 0x3f8

#define baudL 0x3f8
#define baudH 0x3f9

#define LineCtrl 0x3fb
#define ModemCtrl 0x3fc
#define LineStatus 0x3fd


#define LINE 6
#define WIDTH 48


#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <process.h>

unsigned char rev(unsigned char c) //倒置
{
unsigned char i,val=0,ini=1;

for (i=0; i<8; i++){
if (c&0x80) val+=ini;
c<<=1; ini*=2;
}
// val=0xff-val;
return val;
}

void send_data(unsigned char ch)
{
while((inportb(LineStatus)&0x60)!=0x60);
outportb(LineCtrl,0x3b); //8-data,1-stop,9th bit=0
outportb(SBUF,rev(ch));
}

void send_addr(unsigned char ch)
{
while((inportb(LineStatus)&0x60)!=0x60);
outportb(LineCtrl,0x2b); //8-data,1-stop,9th bit=1(SEND address)
outportb(SBUF,ch);
}

void send_order_para(unsigned char ch)
{
while((inportb(LineStatus)&0x60)!=0x60);
outportb(LineCtrl,0x3b); //8-data,1-stop,9th bit=0
outportb(SBUF,ch);
}

unsigned char ones(unsigned char ch)
{
unsigned char i,res=0;

for (i=0; i<4; i++)
{
if (ch&1) res++;
ch>>=1;
}
res&=1;

return res;
}


unsigned char verify(unsigned char addr,unsigned char order) //生成一个addr 和order的校验码
{
unsigned char check,ch;

check=addr^order; check=check^(check<<4);
check&=0xf0;

ch=(addr&0xf0)>>4; check=check+ones(ch);
ch=addr&0x0f; check=check+ones(ch)*2;
ch=(order&0xf0)>>4; check=check+ones(ch)*4;
ch=order&0x0f; check=check+ones(ch)*8;

return check;
}



void main()
{
unsigned char address=0x01,order=0x01, check,checkback,ch;
int i,j;
unsigned char TempChar;
FILE *fp;

outportb(LineCtrl,0x80);
outportb(baudL,0x02);
outportb(baudH,0x00); //baud-rate=57.6k
/*
波特率改成57.6k
*/

outportb(ModemCtrl,0x00); //dis-connect SOUT and SIN in computer

outportb(LineCtrl,0x2b); //8-data,1-stop,9th bit=1(SEND address)

if (inportb(LineStatus)&1)
inportb(SBUF);

order=0x01; //命令0x01为发送整屏数据
send_addr(address);
send_order_para(order);
check=verify(address,order);
send_order_para(check);

while(!(inportb(LineStatus)&1));
//等待单片机应答。这里需要处理一下、不能死等,否则在单片机未上电等情况下会死机
checkback=inportb(SBUF);

if (checkback!=check)
exit(1); //NO ACK or Wrong ACK
//出口引向何处也需要重新处理

check=0x00;
for (i=0; i<48; i++)
for (j=0; j<96; j++)
{
TempChar=0x55;
send_data(TempChar);//msg_dz[i][j]);
ch=rev(TempChar);
check=check+ch;//msg_dz[i][j]);
printf("check= %d ,checkback= %d \n",&check,&checkback);
// send_data(0x55);//msg_dz[i][j]);
// check+=rev(0x55);//msg_dz[i][j]);
}
while(!(inportb(LineStatus)&1));
checkback=inportb(SBUF);

if (checkback!=check)
exit(1); //NO ACK or Wrong ACK

order=0x02; //0x02为显示命令
send_addr(address);
send_order_para(order);
check=verify(address,order);
send_order_para(check);

while(!(inportb(LineStatus)&1));
checkback=inportb(SBUF);

if (checkback!=check) //check
exit(1); //NO ACK or Wrong ACK

}

pc同单片机用rs485方式来连接
...全文

相关推荐

SPComm串口控件在Delphi XE10.1中的应用与实战

特性描述无界面阻塞主线程不参与I/O操作,UI始终保持响应高并发能力可同时管理多个串口连接而不相互干扰低CPU占用使用WaitForMultipleObjects等待事件,避免忙轮询灵活扩展性支持自定义缓冲区大小与超时策略此外,SPComm还利用Windows的重叠I/O(Overlapped I/O)机制进一步优化性能。通过指定标志打开串口句柄,允许异步读写操作在后台执行,真正实现非阻塞行为。begin。

13572025090

Delphi串口通信SPCOMM控件实战应用

在现代工业自动化与嵌入式系统开发中,串口通信因其稳定、可靠、低成本的特性,广泛应用于设备间的数据交互。Delphi作为一种面向对象的Pascal语言开发工具,凭借其强大的VCL组件库和高效的Windows API封装能力,成为实现串口通信的理想选择。本章将首先介绍串口通信的基本原理,包括RS-232协议、数据帧结构与通信流程;随后分析Delphi如何通过控件(如SPCOMM)或原生API实现串口操作,帮助开发者快速构建稳定的数据传输系统。

富叔

Delphi7串口通信组件SPComm深度解析与实战应用

htmltable {th, td {th {pre {简介:SPComm是Delphi7环境下一款高效稳定的串口通信组件,广泛应用于嵌入式系统、工业自动化、GPS设备等领域的串口数据交互。本文深入解析SPComm的核心功能,包括串口的打开与关闭、参数配置、数据收发、错误处理、流控制及多线程支持,并结合实际应用场景,指导开发者如何利用SPComm实现可靠的串口通信程序。通过本内容的学习,开发者可掌握串口通信开发的关键技术,提升在硬件交互项目中的实践能力。

DIY飞跃计划

fengmian123

fengmian123

CiYuanShuos

QYR-18900-2026-2032全球与中国智能旋转导向钻井系统市场现状及未来发展趋势 Sample-shijunzhong.docx

QYR-18900-2026-2032全球与中国智能旋转导向钻井系统市场现状及未来发展趋势 Sample-shijunzhong.docx

qyresearch报告
评论 5
收藏 已收藏
分享
返回顶部