小编Dan*_*llo的帖子

5
推荐指数
1
解决办法
547
查看次数

如何以面向对象的形式实现串行通信协议?

我正在研究使用RS232连接到PC的嵌入式设备.

我需要做一个软件来与这个嵌入式设备进行通信.

我用Delphi编程.我以前从未习惯使用面向对象.但我试图改变这一点.

我无法以面向对象的方式思考解决这个问题.

我有这个协议:

<STX><STX><COMMAND>[<DATA><DATA>...]<CHKSUM><ETX>
Run Code Online (Sandbox Code Playgroud)

哪里:

<STX> is the Start of TeXt (0x55);
<COMMAND> can be 0x01 for read, 0x02 for write, etc;
<DATA> is any value;
<CHKSUM> is the checksum;
<ETX> is the End of TeXt (0x04).
Run Code Online (Sandbox Code Playgroud)

软件计算机将通过串行发送命令,设备将使用相同的协议应答.

例如:

Reset command
PC sends     : <STX><STX><0x09><0x00><CHKSUM><ETX>
Device answer: <STX><STX><0x09><0x00><CHKSUM><ETX>

Get Version
PC sends     : <STX><STX><0x00><0x02><CHKSUM><ETX>
Device answer: <STX><STX><0x00><0x00><VER_L><VER_H><CHKSUM><ETX>
Run Code Online (Sandbox Code Playgroud)

我必须将文件流发送到设备.

我想获得以面向对象的方式实现这一点的最佳方法的建议和/或示例.我也希望能够进行单元测试.

谢谢

delphi oop communication

5
推荐指数
2
解决办法
2078
查看次数

PC Lint while(TRUE)vs for(;;)

我是第一次使用PC Lint.当PC Lint警告我我的时候,我正在"linting"我的代码while(TRUE).

这就是它所说的:

716:while(1)... - 找到形式的构造,而(1)......被找到.

虽然这表示期望布尔值的上下文中的常量,但它可以反映编程策略,其中无限循环以此构造为前缀.因此,它被赋予一个单独的数字,并被放入信息类别.更常规形式的无限循环前缀是(;;).

我不明白这个说法.任何人都可以帮我理解吗?

c embedded lint pc-lint

5
推荐指数
1
解决办法
1879
查看次数

Firemonkey TEdit高度

我正在使用Delphi Seattle,我的应用程序是用于Windows桌面的.

我正在尝试更改TEdit的字体大小.因此,高度也被修改.在设计时,一切都运行良好,但是当我运行我的应用程序时,TEdit忽略高度修改并且文本被剪切.

我试图找到这里的FixedHeight建议,但我找不到这个属性.

是否有可能改变TEdit Heigth?

delphi height textbox firemonkey

5
推荐指数
1
解决办法
1967
查看次数

"旧格式或无效类型库"

我们有一个应用程序,除了许多其他东西,还有一个导出到Excel功能.这使用Excel COM接口,只是将一些数据导出到Excel中的新工作表,并将其格式化为它来自的位置.多年来,我们知道如果将机器区域设置设置为与安装Office不同的东西,则会出现"旧格式或无效类型库".但是,在Excel 2003下,可以下载并安装MUI(多语言用户界面)包以解决问题.使用Excel 2007及更高版本似乎没有相同的包 - 有语言包(我们从MSDN for Office 2007下载了7GB包)但这些都不起作用(setup.exe被"损坏"),或者不要从某种意义上讲,我们仍然会遇到"旧格式或无效类型库"的问题.

有谁知道Office 2007和Office 2010是否有一个肯定能解决这个问题的方法,以及从哪里获取它?

或者,有一个MS链接(http://support.microsoft.com/default.aspx?scid=kb;en-us;Q320369),它显示了一些代码(在VB.Net中我认为),据称这些代码暂时设置了文化在Excel中执行操作之前先"en-US",然后将其设置回来.我对此解决方案持怀疑态度,因为它似乎假设原始Office安装始终为"en_US".如果是瑞士德国人怎么办?有没有人成功使用过这种方法,并且他们曾经在win32 Delphi中做过,你能分享一些代码片段吗?

delphi multilingual office-2007 ms-office

4
推荐指数
1
解决办法
1351
查看次数

PC Lint警告537:重复包含文件

如何从PC Lint处理此警告?

我有几个文件#include <GenericTypeDefs.h>.PC Lint向我显示消息Warning 537: Repeated include file 'filepath\filename.h'如果我删除此声明我无法编译.

如果可能的话,我想取消这个警告.

你可以在这里看到同样的报道.

这是我的代码,我的编译器发出警告:

checksum.h

#ifndef CHECKSUM_H
#define CHECKSUM_H

#include <GenericTypeDefs.h>

BOOL isCheckSumCorrect(const UINT8 *dataPointer, UINT8 len, UINT8 checkSumByte);

#ifdef  __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)

cryptography.h

#ifndef CRYPTOGRAPHY_H
#define CRYPTOGRAPHY_H

#include <GenericTypeDefs.h>

UINT8 encrypt(UINT8 c);
UINT8 decrypt(UINT8 c);

#ifdef  __cplusplus
extern "C" {
#endif
Run Code Online (Sandbox Code Playgroud)

crc8.h

#ifndef CRC_H
#define CRC_H

#include <GenericTypeDefs.h>

UINT8 generateCRC(const UINT8 *ptr, UINT8 Len);
BOOL isCRCValid(const UINT8 *ptr, UINT8 Len, UINT8 CRCChar); …
Run Code Online (Sandbox Code Playgroud)

c lint pc-lint

4
推荐指数
1
解决办法
6529
查看次数

在Delphi XE6中使用枚举错误声明数组

当我声明这样的枚举时:

TConfigBaudRate = (br9600 = 6, br19200 = 8);
Run Code Online (Sandbox Code Playgroud)

并尝试将此枚举与数组一起使用,如下所示:

const
    CBaudRates: array [TConfigBaudRate] of string = ('9600', '19200');
Run Code Online (Sandbox Code Playgroud)

Delphi返回以下错误:

E2072元素数量(2)与声明(3)不同

但是,如果我声明TConfigBaudRate没有值或它的第一个项的值.

似乎Delphi创建了一个7号元素.这是Delphi的正常特性吗?我找不到任何参考.

arrays delphi enums

4
推荐指数
2
解决办法
951
查看次数

Delphi:在设计模式下"找不到资源" - 为什么?

我收到了一个错误,我不知道为什么会得到它...

所以:我有一个基于sAlphaButton的新组件.这有ImageList属性,我的组件用我自己的标题/图像扩展这个按钮,翻译成匈牙利语.

我使用LoadRes来获取预定义的图像.

看到这个:

procedure TScrollPNGButton.LoadAsImageListFromRes(ResNames : TStrings; IL : TsAlphaImageList);
var
    s : string;
    i : integer;
begin
    IL.CLear;
    for i := 0 to ResNames.Count - 1 do begin
        s := ResNames[i];
        AddImageFromRes(hInstance, IL, s, ifPNG);
    end;
end;


procedure TScrollPNGButton.LoadResToImageList;
var
    sl : TStringList;
begin
    sl := TStringList.Create;
    try
        sl.Text :=
            Trim(
                    'scrollpngbutton_ok'#13 +
                    'scrollpngbutton_cancel'#13 +
                    'scrollpngbutton_close'#13 +
                    'scrollpngbutton_yes'#13 +
                    'scrollpngbutton_no'#13 +
                    'scrollpngbutton_refresh'#13 +
                    'scrollpngbutton_print'#13 +
                    'scrollpngbutton_email'#13 +
                    'scrollpngbutton_add'#13 +
                    'scrollpngbutton_delete'#13 +
                    'scrollpngbutton_edit'#13 +
                    ''
                );
        LoadAsImageListFromRes(sl, FImgs);
    finally …
Run Code Online (Sandbox Code Playgroud)

delphi resources components

3
推荐指数
1
解决办法
4375
查看次数

开发 LCD 显示模拟器的技巧

我想开发一个用于教育目的的 PC LCD 显示模拟器。显示器采用HD44780。

我不知道从哪里开始。

embedded lcd emulation hd44780

2
推荐指数
1
解决办法
1692
查看次数

8位二进制加法

有人可以解释如何使用8位二进制加法计算校验和吗?这是文档的摘录:

这是消息的一般形式:

STX | TYPE | FS | DATA | FS | CHK | ETX
Run Code Online (Sandbox Code Playgroud)

STX是HEX 02

ETX是HEX 03

FS是HEX 15

"类型"是唯一的1字节消息标识符(例如,用于轮询消息的"P")."数据"包含可打印的ASCII字符.

校验

校验和是根据所有字符计算的,包括和<FS>之间的所有字符.校验和通过所有包含字符的8位二进制加法计算,其中第8个或奇偶校验位假定为零.超过第8位的数据丢失了.8位结果转换为两个可打印的ASCII十六进制字符,范围从00到FF,然后插入到数据流中.十六进制字符AF是大写的.接收设备重新计算缓冲消息的校验和,并将其与收到的校验和进行比较.比较是后续确认()或传输的否定确认()的基础.<STX><CHK><CHK><ACK><NAK>

java delphi algorithm binary checksum

2
推荐指数
1
解决办法
2396
查看次数