赶不上潮流了,也该学学USB了,买了圈圈的书,不过在51上重复一遍没啥意思,JLink是ARM,还带USB,来来,用它来练练手吧。
JLink有JTAG信号口,一般没有焊插针。焊上插针,拿杜邦线连上另一个JTAG,嘿嘿,这就完成基础硬件的搭建了。
JLink上的MCU的串口很不幸,TXD口线接到245输入了,没串口用了,没办法,semihost吧。
前天,客户来电说GPS巡线系统的后台数据库挂了,原因是原来分配给图片存储磁盘的空间不够了,他调整了一下分区。我让他把整个MySQL目录的文件备份下来(后来发现这是多么重要),然后重装一下数据库试试。重装以后发现不行。于是给我让他发了MySQL下面的data目录文件给我,还有今年二月份用后台软件备份下来的数据备份也发了过来。
网上查询发现MySQL的数据存储在data目录下的ibdata1文件中,使用UE打开该文件,发现全是0,显然不能包含数据,对比公司内部测试使用的MySQL服务器,确认该文件用于存储数据库数据。看来只能是使用二月份的备份数据了。
打开二月份备份数据,发现数据库的字符集用的是binary,这是当时不太清楚字符集该怎么设,从别人那里继承来的。试图重装一个MySQL,设定为binary,恢复还是有错误。在MySQL命令行中手动执行恢复操作,提示是数据库字段宽度不够,手动调整数据库字段大小,成功走完恢复过程,但是恢复出来的数据显示是乱码。
用UE打开备份文件,发现前面是FEFF,UTF的编码标记,后面是有规律的一个字节数据,一个字节的零,手动提取字节数据,恢复出来时可读的,于是想利用程序提取出来非零数据,然后恢复。结果,发现程序死活不能读到标记字节FEFF。想可能VC2008+Win7可能自动给你处理了FEFF,于是上VMWare+DOS622+TC2,结果还是一样,查到网上有一篇文章 How NOT to skip BOM info (FF FE) when using fread or ifstream? 这个现象一摸一样。就是没有解答。
早晨又想到一个方法,利用文件传输,这下该啥码都出来了吧,于是上串口互联,一个串口打开串口调试软件,另一个串口copy,发现接收出来数据不对,MODE命令设之,发现收到的数据和UE的还是不一样啊。对比利用EmEditor二进制打开的文件,却发现串口接收的和EmEditor的一样。对比EmEditor的字节数和文件属性字节数,一致。验证C程序,一致。用EmEditor给文件加上UTF编码标记,C程序读取,可以读取到BOM数据。最后验证UE中间做了手脚,天啊。哎,太相信UE了。
MySQL最终恢复却都没用到这些,呵呵。今天客户又打电话过来,问我怎么样了,我交流以后发现,他还是按我说的备份了全部的MySQL安装目录,还有,他提到其他盘有一个ibdata1文件,时间太长了,我都忘了,应该是当时我为了数据安全,安装的时候将数据文件放到别的分区中了。这下好了,分析客户发过来的全部资料,清楚了原来安装MySQL的原始结构,并且发现原来的MySQL配置文件的MySQL自动备份存在MySQL目录中。于是就超级简单了。停止MySQL服务,移掉MySQL相关目录,解压客户发过来的数据到MySQL安装目录中,修改配置文件,在相应的路径中放置ibdata1,重启服务,OK,一切正常。
想想,Linux系的软件还是好啊,恢复起来赶紧利落。
软件开发界面管理
丁写完了倒闸系统的界面说明书,和预想的差距较大,不是我所要的效果。我想可能是方式的问题。
上午想到了使用软件界面设计工具,搜了一个,觉得应该可行,下一步决定让熊工将文档挪到软件中表达,丁开始做元件部分整理。
2009.02.06 10:36:00 from footprintz.blogcn.com
整理接手的VC2003的MFC程序,升级到2005,调试运行提示清单问题。经过研究,发现VC2005程序Debug模式不能嵌入清单,而Release模式嵌入不嵌入均可。
2009-02-06 后来发现也不一定,如果碰到相同的情况,可以一试吧。
写windows的服务程序当然算不上什么高级编程,但是一般人可能不太注意服务程序的形象问题。打开服务管理器,服务名称就是程序名,更没有描述。看起来挺别扭。起始要使服务好看一点,只需要几步即可(以VC6为例):
SC_HANDLE hService = ::CreateService(
hSCM, // SC_HANDLE hSCManager, handle to service control manager database
m_szServiceName, // LPCTSTR lpServiceName, pointer to name of service to start
_T("世纪德润看护服务"), // LPCTSTR lpDisplayName, pointer to display name
SERVICE_ALL_ACCESS, // DWORD dwDesiredAccess, type of access to service
SERVICE_WIN32_OWN_PROCESS, // DWORD dwServiceType, type of service
SERVICE_AUTO_START, // DWORD dwStartType, when to start service
SERVICE_ERROR_NORMAL, // DWORD dwErrorControl, severity if service fails to start
szFilePath, // LPCTSTR lpBinaryPathName, pointer to name of binary file
NULL, // LPCTSTR lpLoadOrderGroup, pointer to name of load ordering group
NULL, // LPDWORD lpdwTagId, pointer to variable to get tag identifier
_T("RPCSS/0"), // LPCTSTR lpDependencies, pointer to array of dependency names
NULL, // LPCTSTR lpServiceStartName,pointer to account name of service
NULL); // LPCTSTR lpPassword pointer to password for service account
在::CloseServiceHandle(hSCM);以前添加:
// Need to acquire database lock before reconfiguring.
SC_LOCK sclLock = LockServiceDatabase(hSCM);
if (sclLock != NULL)
{
// Open a handle to the service.
SC_HANDLE hService = OpenService(
hSCM, // SCManager database
m_szServiceName, // name of service
SERVICE_CHANGE_CONFIG); // need CHANGE access
if (hService != NULL)
{
SERVICE_DESCRIPTION sdBuf;
sdBuf.lpDescription = _T("提供北京世纪德润科技有限公司服务程序的看护服务。");
if (ChangeServiceConfig2 (hService, SERVICE_CONFIG_DESCRIPTION, &sdBuf))
{
// MessageBox(NULL, "Change SUCCESS", "", MB_SERVICE_NOTIFICATION);
}
CloseServiceHandle(hService);
}
UnlockServiceDatabase(sclLock);
}
这就改了服务名称,添加了服务描述。
至于对于VS2003及以上,我喜欢从库里面拎出来相关部分,然后修改,类似于:
template <class T, UINT nServiceNameID>
class ATL_NO_VTABLE CDRAtlServiceModuleT : public CAtlExeModuleT<T>
CommDebug v1.1.3.6
自己开发的一个通讯调试软件,个人觉得还是有点特色的。
特点:
-----------------------------------
#第一个字母 S -> 发送报文, R -> 等待接收, T -> 等待一定时间。
#S 后面 M: 表示后续报文为混合模式。H:十六进制,S:字符串
#R 后面 T 表示等待一个超时时间或接收到报文(ms), M: 表示后续为混合模式。
#T 等待一个时间(ms)。
S:M:{0d}{0e}send{0d}{0a}tools programs commdebug
R:T10000:M:{0d}{0a}recv
T10000
S:S:tools programs commdebug
-----------------------------------
欢迎使用,并提出宝贵意见。