博文

【转】S0/0 S0/1口的作用(2009-01-21 09:06:00)

摘要:S0/0 S0/1口是用来接64K-2M专线的,它的接口是60针的,需要加一台协议转换器来接到运营商的光端机上;

F0/0是外网以太网口 F0/1是内网以太网口;

AUX口是用来从远程modem登录管理的,它需要接一个外置的modem,并且还要有一个电话线(能被打进电话)。......

阅读全文(1368) | 评论:0 | 复制链接

[原]VC串口API超时的详细介绍(2009-01-04 11:23:00)

摘要: _BAT_姜维    发表于2009年01月04日 11:09 阅读(0) 评论(0) 分类: 串口API 权限: 公开 昨天调了一下API结果发现同步ReadFile居然没堵塞就返回,那同步和异步岂不是一个样了,太阳!

线程没错,都没错,所以又拿资料出来看,发现有个超时设置,应该就是他了,嘿嘿。
我原本程序:
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。

//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时


我留意了一下,它所说的超时是指串口读写操作超时
而总超时就是函数返回的标准,如果操作在总超时之前没完成,那么就结束了本次操作,如果在总超时之前完成了,那马上返回,官方资料:

COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+时间常量
例如,要读入10个字符,那么读操作的总超时的计算公式为:
读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant


要注意到无论读或者写,都有个要求的数目和实际读到的数目引用
ReadFile(hCom,str,wCount,&wCount,NULL);
wCount要求读入的数目,&wCount读到的数目引用
总超时=WriteTotalTimeoutMultiplier×wCount+ReadTotalTimeout......

阅读全文(7451) | 评论:0 | 复制链接

vc 程序打包(2008-12-24 09:19:00)

摘要:installshield
wise isntall
setupfactory
nsis
都可以满足你......

阅读全文(2656) | 评论:0 | 复制链接

转C# SerialPort运行方式(2008-09-11 21:53:00)

摘要:C# SerialPort运行方式 SerialPort中串口数据的读取与写入有较大的不同。由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取。一、线程实时读串口;二、事件触发方式实现。
由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。
另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。如下:

SerialPort spSend;  //spSend,spReceive用虚拟串口连接,它们之间可以相互传输数据。spSend发送数据
SerialPort spReceive;  //spReceive接受数据
TextBox txtSend;  //发送区
TextBox txtReceive;  //接受区
Button btnSend;  //数据发送按钮
delegate void HandleInterfaceUpdateDelegate(string text);  //委托,此为重点
HandleInterfaceUpdateDelegate interfaceUpdateHandle;

public void InitClient()  //窗体控件已在初始化
{
  interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox);  //实例化委托对象
&nb......

阅读全文(4707) | 评论:4 | 复制链接

[转载]C#中串口通信编程(2008-09-11 20:59:00)

摘要:原文及源代码位置:http://bbs.msproject.cn/default.aspx?g=posts&t=333

原文作者:ivanx

转载自:http://bbs.msproject.cn/

[翻译]
Tapan Dantre.著Serial Communication using C# and Whidbey


[简介]

本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名

空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。

我们将使用标准的RS 232 C 在PC间通信。它工作在全双工模式下,而且我们不打算使用任何的握手

或流控制器,而是使用无modem连接。

命名空间

System.IO.Ports命名空间中最重用的是SerialPort 类。

创建SerialPort 对象

通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程。
我们将要用到的SerialPort 类的方法:
ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULL
WriteLine(string):写入输出缓冲
Open():打开一个新的串口连接
Close():关闭 Code: //create a Serial Port object
SerialPort sp = new SerialPort ();

默认情况下,DataBits 值是8,StopBits 是1,通信端口是COM1。这些都可以在下面的属性中重新设置



BaudRate:串口的波特率
StopBits:每个字节的停止位数量
ReadTimeout:当读操作没有完成时的停止时间。单位,毫秒

还有不少其它公共属性,自己查阅MSDN。

串口的硬件知识

在数据传输的时候,每个字节的数据通过单个的电缆线传输。包包括开始位,数据,结束为。一旦

......

阅读全文(24327) | 评论:9 | 复制链接

转socket非阻塞模型(2008-08-24 11:09:00)

摘要:1、select 模型
int select(
int nfds,    //忽略,兼容Berkeley套接字
fd_set* readfds,   //可读套接字集合
fd_set* writefds,   //可写套接字集合
fd_set* exceptfds,   //指向套接字集合,检查错误
const struct timeval* timeout //超时时间,NULL为无限等待
);
typedef struct fd_set {
u_int fd_count;    //数组大小
SOCKET fd_array[FD_SETSIZE]; //socket数组
} 预定义的4个操作fd_set的常用宏:
FD_ZERO(*set) 初始化set为空,清空集合
FD_CLR(s,*set) 从set移除s
FD_ISSET(s,*set)检查s是否在set中,true-存在
FD_SET(s,*set) 添加s到set中 评价:
单线程可以处理多个socket,但是需要不断进行对select返回的结果进行检查,性能不高
2、WSAAsyncSelect 模型
异步Windows消息通知模型 非阻塞同步模型,先产生windows消息,然后进行操作,操作不完成不返回
int WSAAsyncselect(
SOCKET s,    //socket句柄
HWND hWnd,    //指定接受消息的窗口句柄
u_int wMsg,    //指定网络事件来到时接受到的消息ID
long lEvent    //指定哪些网络事件需要通知
);

lEvent可以取以下值的组合:
FD_READ   缓冲区有数据,可读
FD_WRITE 缓冲区变空,可写
FD_ACCEPT 有连接接入
FD_CONNECT 连接完成
......

阅读全文(2859) | 评论:0 | 复制链接

转socket编程——技术实现(2008-08-23 21:20:00)

摘要:socket 实现 这几天都在玩socket了,有一点心得,贴出来与大家共赏,若有不妥或错误的地方,还请各位看官指点一二。 什么是socket?socket就是...,我在这里就不抄书了,有兴趣的同仁去查查书吧。
不过还要说一句,socket就是不同进程之间的一种通信方式。就象打电话是朋友之间的一种通信方式是一样。个人理解:所谓“通信”,就是相互之间发送数据。有人理解socket是不同计算机之间的一种通信方
式,这是不确切的。两个进程,不管是运行在同一台计算机上,还是运行在不同计算机上,都可通过
socket技术进行通信。 socket套接字的使用需要有网卡的支持,所以socket一般都被用来在不同机器之间通信,而如果在同一台计算机上的两个进程进行通信,通常采用效率更高的共享内存技术来实现。 两个进程之间进行通讯,就需要两个进程同时都在运行了(废话),在具体实现中,两个进程我们通常要区别对待,一个进程专门等待另一个进程给自己发消息,收到消息后进行处理,在把处理结果发送回去。我们把专门处理消息、提供服务的进程称为服务器端,把发送消息、请求处理的进程称为客户端。总体过程就是客户端发送一个消息给服务器端,服务器端进程收到消息进行处理,把处理结果发送给客户端。恩,就是这样。 还有一个问题,如果我现在有一个进程要跟另一台计算机上的某个进程进行socket通信,那在我这个进程中如何指定另一个进程呢?这里还需要说一下另一个概念——端口,如果把操作系统比作一座房子的话,那端口就是房子的窗口,是系统外界同系统内部进行通信的通道。在socket实现中,我们不进行另一个进程的指定,而是指定发送消息或接收消息的端口号。比如说现在进程A要给进程B发消息,我们会把消息发送到进程B所运行的计算机的端口N上,而进程B此时正在监视端口N,这样进程B就能收到进程A发送来的数据,同样进程B也把消息发送到该端口上,进程A也能从该端口收到进程B发送来的数据,当然,这需要客户端和服务器端关于端口号进行一个约定,即共同操作同一个端口。如果客户端把消息发送到端口N1上,而服务器端监视的是端口N2,那通信一定不能成功。端口号最大为65535,不能比这个再大了,但在我们自己的程序中尽量不要用小于1024的端口号,小于1024的端口好很多都被系统使用了,比如23被telnet所使用。 so......

阅读全文(1839) | 评论:0 | 复制链接

转vc中socket编程步骤(2008-08-23 17:33:00)

摘要:vc中socket编程步骤 2008-06-08 11:19 [转]vc中socket编程步骤    sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
  return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
         HIBYTE( wsaData.wVersion ) != 1 ) {
   WSAC......

阅读全文(3728) | 评论:0 | 复制链接

转 定义函数数组[C/C++](2008-08-23 16:46:00)

摘要:// 函数定义
void fun1() { printf("function 1 "); }
void fun2() { printf("function 2 "); }
void fun3() { printf("function 3 "); }
void fun4() { printf("function 4 "); }


// 方法1
// 函数数组定义并赋初值
void (*p[])() = { fun1, fun2, fun3, fun4 };

// 调用数组中的函数
for(int i=0; i < 4; i++)
{
    p[i]();
}


// 方法2
typedef void (*PFUN)();  // 定义函数指针

PFUNC funArray[] = { fun1, fun2, fun3, fun4 };

// 调用数组中的函数
for(int i=0; i < 4; i++)
{
    funArray[i]();
}   http://blog.csdn.net/mynamelj/archive/2007/10/06/1813043.aspx......

阅读全文(3024) | 评论:0 | 复制链接

转利用MFC的Csocket类实现网络通信(2008-08-20 21:21:00)

摘要:近年来,利用Internet进行网际间通讯,在WWW浏 览、FTP、Gopher这些常规服务,以及在网络电话、多媒体会议等这些对实时性要求严格 的应用中成为研究的热点,而且已经是必需的了。Windows环境下进行通讯程序设计的最基本方法是应用Windows Sockets实现进程间的通讯,为此微软提供了大量基于Windows Sockets的通讯API,如WinSockAPI、WinInetAPI和ISAPI,并一直致力于开发更快、 更容易的通讯API,将其和MFC集成在一起以使通讯编程越来越容易。本实例重点介绍使用MFC的CSocket类编写网络通讯程序的方法,并通过使用CSocket类实现了网络聊天程序。程序编译运行后的界面效果如图一所示:


图一、网络聊天程序界面效果图
  一、实现方法

  微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。CAsyncSocket类逐个封装了WinSock API,为高级网络程序员 提供了更加有力而灵活的方法。这个类基于程序员了解网络通讯的假设,目的是为了在MFC中使用WinSock,程序员有责任处理诸如阻塞、字节顺序和在Unicode与MBCS 间转换字符的任务。为了给程序员提供更方便的接口以自动处理这些任务,MFC给出 了CSocket类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API接口。Csocket类和CsocketFile类可以与Carchive类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。CSocket对象提供阻塞模式,这对于Carchive的同步操作是至关重要的。阻塞函数(如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept())直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要方便,则可使用Csocket类。

  一些网络应用程序(如网络电话、多媒体会议工具)对实时性要求非常强,要求能够直接应用WinSock发送和接收数据。为了充分利用MFC 的优势,首选方案应当是MFC中的CAsyncSocket类或CSocket类,这两个类......

阅读全文(2597) | 评论:0 | 复制链接