我正在研究使用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)
我必须将文件流发送到设备.
我想获得以面向对象的方式实现这一点的最佳方法的建议和/或示例.我也希望能够进行单元测试.
谢谢
我是第一次使用PC Lint.当PC Lint警告我我的时候,我正在"linting"我的代码while(TRUE).
这就是它所说的:
716:while(1)... - 找到形式的构造,而(1)......被找到.
虽然这表示期望布尔值的上下文中的常量,但它可以反映编程策略,其中无限循环以此构造为前缀.因此,它被赋予一个单独的数字,并被放入信息类别.更常规形式的无限循环前缀是(;;).
我不明白这个说法.任何人都可以帮我理解吗?
我正在使用Delphi Seattle,我的应用程序是用于Windows桌面的.
我正在尝试更改TEdit的字体大小.因此,高度也被修改.在设计时,一切都运行良好,但是当我运行我的应用程序时,TEdit忽略高度修改并且文本被剪切.
我试图找到这里的FixedHeight建议,但我找不到这个属性.
是否有可能改变TEdit Heigth?
我们有一个应用程序,除了许多其他东西,还有一个导出到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中做过,你能分享一些代码片段吗?
如何从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) 当我声明这样的枚举时:
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的正常特性吗?我找不到任何参考.
我收到了一个错误,我不知道为什么会得到它...
所以:我有一个基于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) 我想开发一个用于教育目的的 PC LCD 显示模拟器。显示器采用HD44780。
我不知道从哪里开始。
有人可以解释如何使用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>
delphi ×7
c ×2
embedded ×2
lint ×2
pc-lint ×2
algorithm ×1
arrays ×1
binary ×1
checksum ×1
components ×1
dunit ×1
emulation ×1
enums ×1
firemonkey ×1
hd44780 ×1
height ×1
java ×1
lcd ×1
ms-office ×1
multilingual ×1
office-2007 ×1
oop ×1
resources ×1
singleton ×1
tdd ×1
textbox ×1
unit-testing ×1