发新帖我要提问
12
返回列表
打印

[菜地公告]全面征求HotComm串口控件需求功能意见

[复制链接]
楼主: HotPower
手机看帖
扫描二维码
随时随地手机跟帖
21
HotPower|  楼主 | 2007-6-21 02:13 | 只看该作者 回帖奖励 |倒序浏览

9位多机通讯没搞过,过后再研究~~~地球对面人先照顾

TestCode:

    现在进展很顺利,不过就是太费工夫,几乎是个机器人在敲键盘~~~
你多线程的问题我想好了~~~明天(今天)做.

准备采用6线程~~~不过都可自动装配拆除...用户事件编程的习惯坚决不能改.
即所有用户的事件或线程都在用户的事件回调函数里做.

线程运行/回调运行/查询运行自选.

但用户的线程我要将其"套在肚子里"~~~否则要翻天的~~~一但发现他干坏事
就把线程交给他自己玩去~~~免得拖累系统,造成死锁.

使用特权

评论回复
22
HotPower|  楼主 | 2007-6-21 02:49 | 只看该作者

今天先满足TestCode关于用户多线程的问题

框架基本形成,现在装配~~~ 

今天先满足TestCode关于用户多线程的问题. 

估计要复杂些,不过CVI的函数面版要比Delphi的强大的多,比较直观. 

我将函数归类为树状结构主要是分类查询最快,很容易找到自己所需的函数. 

CVI的编程非常方便,可能开始感觉很别扭,时间长了就知道它的优点所在了. 

昨天主要是做HotComm的工具包,是为编程辅助用的.只有在极少数情况下才 

需要.不过我还是加进入了,因为我在其他上用的不错,也就直接移进入了. 

由于都是成熟的程序和算法,也不费什么时间. 

现在PC的资源对单片机而言可谓是无限的,所以谈不是大. 

昨天也进行了用户回调的安装和运行,想与常用的靠近点. 

SPCOMM的全部满足.MSCOMM的也就很好实现了. 

总之回调方法越多越方便,而且可以选择查询,事件和线程三种方式. 

既然我敢冒天下大不惟,那自然有我的道理和手段. 

哈哈~~~武林"英雄帖"可不是随便敢发的~~~否则不被拍死才怪!!! 

本来NI在西安7月12日有个串口和仪表接口的研讨会不知为何通知取消了~~~ 

说改在8月22日搞别的研讨,问菜农参加否... 

难道我的用户字样包含了"雁塔"字样???可没包含"菜农"呀... 

而且是科研所而非"农科所蔬菜系"... 

倒塌了~~~

使用特权

评论回复
23
hqgboy| | 2007-6-21 08:44 | 只看该作者

支持.

使用特权

评论回复
24
kelan| | 2007-6-21 12:29 | 只看该作者

期待 HotCOM for VC 版本!


 VC 版本 何时摆上桌菜啊?

使用特权

评论回复
25
HotPower|  楼主 | 2007-6-21 13:09 | 只看该作者

仿效DELPHI完美的事件机制

例如:
123$GPS,1233,1232*88xodx0a$Hot....
起始符$
过滤串$GPS,
校验结束符*
校验和88
终止符x0a(回车)

HotComm可以安装很多的用户事件,就和Delphi一样
假使正确的应该为$GPS,...x0a$Hot,....
我们可以设定:
起始符为$
终止符x0a
过滤串x5$GPS,(x5为过滤串长度,在str[0])并安装过滤事件处理回调函数
其返回值为真,HotComm将放弃此前的所有搜索(包括起始符),这时肯定只能
搜到终止符x0a.
由于起始符和终止符必须成对出现,而起始符早已被放弃,故本行字符串无效!!!
继续接收串口数据$Hot,....,这次就对了...

这用于屏蔽不用的GPS语句非常有用~~~(实用!!!)
而且不用用户做太多的工作.

已经接受了TestCode的意见.
用户事件也可自动选择查询,事件和中断(线程)三种方式.

晕~~~没时间整理文档~~~

总之菜农要实现自己的心愿(大学的第1课开课前在笔记本上写的)
让人类从繁重地,危害身心健康的体力劳动中解放出来!

哈哈~~~年轻时的幻想和梦我这辈子是玩完了~~~隔世再完成我的心愿吧~~~

自控是我的专业,爱好是栽培洁白地蔬菜~~~荒废专业了~~~

使用特权

评论回复
26
E_T| | 2007-6-21 20:27 | 只看该作者

研讨会那天去瞧瞧菜农真人的风采,嘻嘻

使用特权

评论回复
27
HotPower|  楼主 | 2007-6-21 22:26 | 只看该作者

哈哈~~~农民一个,每天带草帽~~~草帽里有块白毛巾~~~

哈哈~~~debug反跟踪~~~不过我准备放阶级敌人过去~~~

使用特权

评论回复
28
testcode| | 2007-6-21 23:00 | 只看该作者

串口数据的堵塞

头痛了好久,还没有很好解决...

想知道关于uS级定时器,不知精度如何。用过MFC的定时器,太慢了,最小间隔都要55mS...

使用特权

评论回复
29
HotPower|  楼主 | 2007-6-22 07:21 | 只看该作者

人活一口气~~~当要下山时就要垮了~~~

HotComm已经出来了,只是添加功能和改善性能的问题了.

2个月的3小时睡眠的日子应该结束了,搞菜农三剑客真的好累呀.

所以昨晚就关闭了网~~~

哈哈~~~看了会Windows CE.net....

既然是TestCode同志,你怎么不早10年前问呢???倒塌了~~~

看来MCU界的朋友和PC界的朋友技术是隔行的~~~

uS级定时器实际是调用API函数:
QueryPerformanceCounter();
QueryPerformanceFrequency();

HotComm中关于HotCommTimer的源码如下:
1.定义结构
typedef struct
{
    LARGE_INTEGER litmp;
    LONGLONG QPart1;
    LONGLONG QPart2;
    double dfMinus;
    double dfFreq;
    double dfTim;
    double numSeconds;
    int numCount;
}HotTimerStruct;

2.申请全局变量
HotTimerStruct HotTimer;//定时器结构体

3.对API封装后的HotCommTimer组合包H文件
void CVIFUNC HotComm_TimerStart (void);

void CVIFUNC HotComm_TimerWait (double numSeconds);

void CVIFUNC HotComm_TimerDelay (double numSeconds);

void CVIFUNC HotComm_TimerSetTimer (double numSeconds);

double CVIFUNC HotComm_TimerGetTimer (void);

HRESULT CVIFUNC HotComm_TimerStop (void);

4.对API封装后的HotCommTimer组合包C文件

void CVIFUNC HotComm_TimerStart (void)
{
    QueryPerformanceFrequency(&HotTimer.litmp);
    HotTimer.dfFreq = (double)HotTimer.litmp.QuadPart;// 获得计数器的时钟频率
    QueryPerformanceCounter(&HotTimer.litmp);
    HotTimer.QPart1 = HotTimer.litmp.QuadPart;// 获得初始值
    HotTimer.numCount = 0;//计数器归零
}

void CVIFUNC HotComm_TimerWait (double numSeconds)
{
    do
    {
      QueryPerformanceCounter(&HotTimer.litmp);
      HotTimer.QPart2 = HotTimer.litmp.QuadPart;//获得终止值
      HotTimer.dfMinus = (double)(HotTimer.QPart2 - (double)HotTimer.QPart1);
      HotTimer.dfTim = HotTimer.dfMinus / HotTimer.dfFreq;// 获得对应的时间值,单位为秒
    } while (HotTimer.dfTim < numSeconds);
}

void CVIFUNC HotComm_TimerDelay (double numSeconds)
{
    HotComm_TimerStart ();//重新启动定时器
    HotComm_TimerWait (numSeconds);
}

void CVIFUNC HotComm_TimerSetTimer (double numSeconds)
{
    double Ts;
    HotComm_TimerStart ();//重新启动定时器
    HotTimer.numSeconds = numSeconds;//设置定时时间
}

double CVIFUNC HotComm_TimerGetTimer (void)
{
    double dfTim, dfMinus;
    QueryPerformanceCounter(&HotTimer.litmp);
    HotTimer.QPart2 = HotTimer.litmp.QuadPart;//获得终止值
    dfMinus = (double)(HotTimer.QPart2 - (double)HotTimer.QPart1);
    dfTim = dfMinus / HotTimer.dfFreq;// 获得对应的时间值,单位为秒
    return dfTim;
}

HRESULT CVIFUNC HotComm_TimerStop (void)
{
    HRESULT __result = S_FALSE;//定时时间未到
    QueryPerformanceCounter(&HotTimer.litmp);
    HotTimer.QPart2 = HotTimer.litmp.QuadPart;//获得终止值
    HotTimer.dfMinus = (double)(HotTimer.QPart2 - (double)HotTimer.QPart1);
    HotTimer.dfTim = HotTimer.dfMinus / HotTimer.dfFreq;// 获得对应的时间值,单位为秒
    if (HotTimer.dfTim >= HotTimer.numSeconds)
    {
        __result = S_OK;//定时时间到    
    }
    return __result;
}

5.举例
void CVIFUNC I2C_SetSDA (void)
{
    unsigned char data;
    HotTimer_Start ();//在XP下启动由菜农同志封装的uS级定时器
    data = inp (Hot_I2CISPDataProtAddress);//读数据口地址的内容
    data |= (1 << I2C_wrSDA);//SDA=1
    outp (Hot_I2CISPDataProtAddress, data);//写数据口1个字节 
    do
    {
        data = inp (Hot_I2CISPDataProtAddress + I2C_rdAddrOff);//读状态口地址的内容
        data &= (1 << I2C_rdSDA);//只取出SDA位!!!!注意没~号
    }
    while ((data == 0) && HotTimer_GetTime () < 0.000014);//最多测试14uS
    if ((I2C_SDALedPanel > 0) && (I2C_SDALedControl > 0))//用户要求面板上的SDA灯与信号同步
    {
        SetCtrlVal (I2C_SDALedPanel, I2C_SDALedControl, 1);//绑定SDA指示灯亮
    }
}


6.倒塌了,要迟到了!!!你也刚好吃晚饭,一会自己看
俺要上班班去了~~~

使用特权

评论回复
30
testcode| | 2007-6-22 15:08 | 只看该作者

多谢hotpower

学习中...

QueryPerformanceCounter();
QueryPerformanceFrequency();
HotComm_TimerWait使用不断查询内部定时器的时钟频率,精确度受线程的优先级别影响,感觉类似WINAVR的_delay_us()函数(深受MCU的毒,哈哈)。

“既然是TestCode同志,你怎么不早10年前问呢???倒塌了~~~”
倒塌了,10年前革命尚未开始,原来的专业早就倒塌了...

再次感谢hotpower的指点!

使用特权

评论回复
31
HotPower|  楼主 | 2007-6-22 19:28 | 只看该作者

这要看你怎么使用QueryPerformanceCounter()了

不管怎样,它比一般的要强的多~~~

本来要想休息2天,不过阶级敌人来犯了,所以菜农要加紧了~~~

使用特权

评论回复
32
wowow| | 2007-6-22 20:19 | 只看该作者

再来一个让你吐血的:加上串口监控功能

加上串口监控功能,Open的时候增加一个监控的选项,可以把数据流发到另一个线程做log或显示. 串口监控做的比较成熟的是SerialMonitor可以参考一下,其它的要么功能简单,要么不稳定.
http://www.hhdsoftware.com/Products/home/serial-monitor.html

我们做串口程序一般用的Pcomm Lite的库,现在版本是1.3 10/25/2005 dll是2.5版,用得挺好,基本功能都有了. 据说Pcomm的很稳定,跑几个月也不会丢数据. 弄不到Pro版的,不知道功能如何,网上能搜到的Pro版是个很老的版本.

使用特权

评论回复
33
HotPower|  楼主 | 2007-6-23 03:48 | 只看该作者

对监控很敢兴趣,不过先做基本的,GPS已经加入.准备再加UU和HEX

使用特权

评论回复
34
gyt| | 2007-6-23 09:41 | 只看该作者

厉害厉害

佩服佩服

使用特权

评论回复
35
hotpower| | 2007-6-24 09:21 | 只看该作者

"垃圾股"HotComm将全面支持I2C/SPI/HQ16/1-Wire等总线

接受TestCode斑竹的建议,陆续将全面支持I2C/SPI/HQ16/1-Wire等总线. 

下图是TestCode提供的,对我很有启发. 

草图已经画出,准备过几天做实验. 

将采用串口窃电的方式,全面支持I2C/SPI/HQ16/1-Wire等总线 

使用特权

评论回复
36
testcode| | 2007-6-24 09:41 | 只看该作者

望Hotpower的串口垃圾股早日发行上市

可否内部先预订几股,免得上市时倒塌了...

套用一句口号,“人有多大胆,地有多大产”。这次建议总算没有让hotpower吐X了,不然估计Hotpower要打击报复了...最近夏天农忙,没有时间抵御阶级敌人的来犯...

使用特权

评论回复
37
hotpower| | 2007-6-24 11:47 | 只看该作者

I2C/SPI/HQ16/1-Wire都将采用串口提供的硬时钟

现在将我自己的协议先倒塌进去了~~~误码率为零.

现在没机子做倒塌实验.

准备用16个串口(38400)经过ARM变为9600后对HotComm进行攻击.
16个机子每路4个I2C,数据126个字节左右.
允许丢码但不允许接收误码.

本协议参照GPS的0813协议,也是以"$"字符开始,以"x0a"结尾.
加密及校验并密文传送.

下图是解密后的无误码数据流.

编程很简单,只需简单的申请即可.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则