春天的BLOG
硬盘终于好了,东西都找回来了,而且竟然系统都没有坏,能够启动起来。。
昨天那么大的雾,像下蒙蒙雨一样,不过我还是去了信息城,虽然我也知道可能要花不少钱,但是我总是不甘心,总觉得我的硬盘根本没有损坏,我也没有格式化,仅仅是分区表丢了而已,可惜我不会找。。就是觉得很对不起同事,挂在他机器上,把他的硬盘也弄坏了,彻底让海尔维修的人换了新的。本来拿着两块硬盘去修复,可惜他的那块格了太多遍,太难弄了。。那个人说不值得,同事也说东西不要了。但事情总归因我而起,总觉得心里歉意。恢复一块硬盘将近100块钱,真是浪费。那个人还说用他的人格保证,这是他做过得最便宜的数据恢复。我真是无话可说。忘了掐表算算他用了几分钟了。当然,要除去检测的时间。。还不让我看,说是行业机密,不能好奇。。晕。。
不过现在我就很害怕对硬盘再有其他操作了,晚上把硬盘拿回家,把东西都拷出来。真是一朝被蛇咬,十年怕井绳啊。。以后尽量不再装两个系统了,终归不是很安全。。
还好,东西都还在,要不我就不知道该怎么办了,还答应领导这个月底把东西都整好。。
15分钟写下的这么多字,语无伦次。。
春天 发表于 5/19/2006 3:33:56 PM 评论:2

摘自MSDN。COM 

To share data, multiple processes can use memory-mapped files that the system paging file stores.

First Process

The first process creates the file mapping object by calling the CreateFileMapping function with INVALID_HANDLE_VALUE and a name for the object. By using the PAGE_READWRITE flag, the process has read/write permission to the memory through any file views that are created.

Then the process uses the file mapping object handle that CreateFileMapping returns in a call to MapViewOfFile to create a view of the file in the process address space. The MapViewOfFile function returns a pointer to the file view.

When the process does not need access to the file mapping object, it should call the CloseHandle function. When all handles are closed, the system can free the section of the paging file that the object uses.

Note  To update the following sample for C++, the result of MapViewOfFile must be cast to match the type of the variable. C++ is more strict about casting than C is.

 

#include <windows.h> #include <stdio.h> #include <conio.h>  #define BUF_SIZE 256 TCHAR szName[]=TEXT("MyFileMappingObject"); TCHAR szMsg[]=TEXT("Message from first process");  void main() {    HANDLE hMapFile;    LPCTSTR pBuf;     hMapFile = CreateFileMapping(                  INVALID_HANDLE_VALUE,    // use paging file                  NULL,                    // default security                   PAGE_READWRITE,          // read/write access                  0,                       // max. object size                   BUF_SIZE,                // buffer size                    szName);                 // name of mapping object      if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)     {        printf("Could not create file mapping object (%d).\n",               GetLastError());       return 1;    }    pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object                         FILE_MAP_ALL_ACCESS, // read/write permission                         0,                                            0,                                            BUF_SIZE);                 if (pBuf == NULL)     {        printf("Could not map view of file (%d).\n",               GetLastError());        return 2;    }         CopyMemory((PVOID)pBuf, szMsg, strlen(szMsg));    getch();     UnmapViewOfFile(pBuf);     CloseHandle(hMapFile);     return 0; }

 

Second Process

A second process can access the same data by calling the OpenFileMapping function with the same name as the first process. Then it can use the MapViewOfFile function to obtain a pointer to the file view.

 

#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUF_SIZE 256
TCHAR szName[]=TEXT("MyFileMappingObject");

void main()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = OpenFileMapping(
                   FILE_MAP_ALL_ACCESS,   // read/write access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object

   if (hMapFile == NULL)
   {
      printf("Could not open file mapping object (%d).\n",
             GetLastError());
      return 1;
   }

   pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_ALL_ACCESS,  // read/write permission
               0,                   
               0,                   
               BUF_SIZE);                  

   if (pBuf == NULL)
   {
      printf("Could not map view of file (%d).\n",
             GetLastError());
      return 2;
   }

   MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}

 

 

春天 发表于 5/12/2006 2:37:37 PM 评论:0

A Friend is.... 朋友就是 ....
Accepts you as you are接受原本的你
Believes
in "you"相信你這個人
Calls you just to say "Hi"打電話給你就是想說聲"嗨"
Doesn't give up
on you從不放棄對你的信心
Envisions the whole
of you預期你總是盡全力
Forgives your mistakes原諒你的過錯
Gives
unconditionally 無條件地過錯
Helps you
幫助你
Invites you over邀請你
Jest "be" with you
靜靜地在你的身旁
Keeps you close at heart 靠近你的心
Loves you for who you are因你原來的樣子而愛你

Makes a difference in your life使你的生活與以往不同
Never judges不論斷
Offers support支持你

Picks you up扶你一把
Quiets your fears止息你的懼怕
Raises your spirits鼓舞你的心靈
Says nice things about you跟別人述說你好的那一面
Tells you the truth when you need to hear it 當需要時會告訴你實情
Understands you懂你
Values you看重你

春天 发表于 5/9/2006 4:38:00 PM 评论:0

  从2号出去,5号早上回来,累的自己睡了整整一天一夜。

  走在天安门广场、王府井大街,天气慢慢的阴下来,下起雨。确实有些不真实。

  在塘沽的海边,看到了那么多的渔船,海却看不到,不如青岛的海漂亮大方。

  一遍一遍的在心里比较各个城市之间的差异,北京是个不错的城市,可是看到人们压力如此之大,确实有些胆怯。

  见到了两个要好的高中同学,职业白领一般,找不到以前的影子了。我却还是这样,基本没有变,傻傻的。

  看来看去,还是觉得青岛是美丽的、安逸的、让人舒适的城市,干净、温润。。

  四月茉莉花开的季节,已经过去了,不知道以后迎接自己的是什么。

春天 发表于 5/6/2006 4:36:11 PM 评论:0

在32位的Windows系统中,每一个进程都有权访问他自己的4GB(232=4294967296)平面地址空间,没有段,没有选择符,没有near和far指针,没有near和far函数调用,也没有内存模式。

每个进程都有独立的4GB逻辑地址空间,32位的Windows系统允许每一个进程独立访问自己的内存,即独立于其它进程,也即它自己的32位逻辑地址空间。操作系统将把每一个进程的逻辑地址转换成实际的物理地址,独立的地址空间可以使其他已经出错的进程之间相互隔离,入阁一个进程通过他自己的内存空间处理数据,其他的进程就比在DOS中安全,在DOS中的所有应用程序共享相同的物理内存空间,虽然这带来了许多好处,但在不同进程之间转的指针,就会出现一些麻烦。在一个进程中,一个给定的逻辑地址将与另一进程的指针不会有相同的逻辑地址。

那么怎么样才能在32位的Windows系统中达到共享内存的目的呢?

随着进程的分离内存空间的出现,进程不能简单地使用GlobalAlloc()函数来分配内存,并把它转递给另一个进程来共享,一个进程检查有另一个进程分配的指针,他只是指向随机地址。然而,在32位的Windows系统支持在进程间共享内存映象文件,可以通过内存映象文件来达到内存共享的目的。

32位的Windows系统的虚拟内存系统具有把实际内存映象到页面文件或交换文件的能力.通过把内存映象到任何想映象的文件,包括系统页面本身,应用程序就可以拓展这种能力。文件影响能用来提供更快更简捷的文件访问方式,并提供内存共享。

把文件映像到内存,首先必须调用CreateFileMapping()函数,然后再调用MapViewOfFile函数,把文件视映像到进程地址空间上。

B:实现与应用
这个实例创建两个简单的应用程序,服务器程序在共享内存中写一字符串,等待更长字符串的写入。客户程序接着读共享内存,并写一新字符串到共享内存并退出。

1、创建服务器程序

首先选择菜单 File | New ,在New Item 对话框中选择 Consol Wizard,在弹出的Consol Wizard 对话框中,去掉"Use VCL"的选项。

在Unit1.cpp众加入以下代码:

//---------------------------------------------------------------------------  
#include  
#include  
#include  
#include  
#pragma hdrstop  
 
//---------------------------------------------------------------------------  
 
#pragma argsused  
int main(int argc, char* argv[])  
{  
  HANDLE hMapping;  
  LPSTR lpData;  
 
  hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"MYSHARE");  
  if(hMapping==NULL)  
  {  
     cout<<"CreateFileMapping() failed.";  
     exit(1);  
  }  
  lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);  
  if(lpData==NULL)  
  {  
     cout<<"MapViewOfFile() failed.";  
     exit(1);  
  }  
  sprintf(lpData,"Server Data String");  
  while(strlen(lpData)<20)  
     Sleep(1000);  
  cout<<"Received:"<   UnmapViewOfFile(lpData);  
  return 0;  
}  
//--------------------------------------------------------------------------- 
2、创建客户应用程序

如同创建服务器程序一样,创建一个新的控制台项目文件,在Unit2.cpp中,加入以下代码:

//---------------------------------------------------------------------------
#include
#include
#include
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  HANDLE hMapping;
  LPSTR lpData;

  hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"MYSHARE");
  if(hMapping==NULL)
  {
     cout<<"CreateFileMapping() failed.";
     exit(1);
  }
  lpData=(LPSTR)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
  if(lpData==NULL)
  {
     cout<<"MapViewOfFile() failed.";
     exit(1);
  }
  cout<<"Server Data:"<   sprintf(lpData,"My Client data string that is longer than 20");
  UnmapViewOfFile(lpData);
  return 0;
}
//---------------------------------------------------------------------------

C:专家点评
要把文件映像到内存,首先必须调用CreateFileMapping()函数,它需要用一个由CreateFile()函数打开并返回的文件句柄,对大多数共享内存应用程序。必须把此句柄设置为0xFFFFFFFF,用来指定系统页面文件。通过使用上面的特殊句柄,可以不调用CreateFile函数,当然在完成时,也不必有一个内存的磁盘文件拷贝。

CreateFileMapping()函数的第二个参数是一个指向SECURITY_ATTRIBUTES结构的指针,它指明返回的句柄是否可以被子进程所继承。另外,在SECURITY_ATTRIBUTES结构中,也包括一个安全性描述的子指针,它由WinNT支持它的安全机制。

第三个参数允许指定内存块的访问权限,权限值有PAGE_READONLY、PAGE_READWRITE和PAGE_WRITECOPY,PAGE_WRITECOPY可以在指定页面上拷贝并写访问。这意味着当一个进程映像此内存并写入时,它将得到自己修改数据的拷贝,面不是写到共享内存空间,另外,可以把几个标志一起使用来指定其他部分的属性。

其他参数允许指定内存块的最大尺寸,如果内存块的尺寸比第一个 参数中指定的文件尺寸还要大,这个文件就增大。

最后一个参数为内存映像对象指定名字,通过调用CreateFileMapping函数和OpenFileMapping函数,其他进程可用这个名字来访问相同的文件映像。

一旦一个内存映像对象由CreateFileMapping()创建成功,可以调用MapViewOfFile函数把文件视映像到进程地址空间上,这个函数需要用一个由CreateFileMapping()函数或OpenFileMapping()函数返回的句柄,并允许指定访问模式和映像的字节数,以及文件映像对象中的偏移量。另外,还可以使用MapViewOfFileEx()函数来实现同样的功能,只是此函数还允许指定映像对象的起始地址。

当用完映像文件后,可以通过调用UnmapViewOfFile函数,释放映像内存并把一些映像数据写入文件(除非它是交换文件),如果想立即把数据写回磁盘文件,那就需要调用FlushViewOfFile()函数把映像内存写入文件。

为了便于读者对以上程序的理解和进行下一步的学习,这里再简单介绍一下Win32内存模式。在开始学习Win32内存管理之前,最好先了解一些16位Windows与32位Windows的区别,它们之间的主要区别是把寄存器和指针长度变为32位。

Win32 API允许应用程序访问虚拟内存,如果想保存大量的数据,这十分有用,尽管大部分空间从来没有用于物理存储。虚拟内存页有四种状态,提交页面被分配一个物理存储单元,不管它是在是在交换文件中,提交页面被锁定后就强行留在内存中,直到解锁为止。保留页面存储一块保留地址国,它不被分配任何存储单元,自由页面都没有用。

VirtualAlloc()函数可用来分配从指定逻辑内存开始的一定范围内的地址,该函数的另一个参数允许指定访问保护标志,并指定内存是否被保存或被用于物理存储单元,也可以调用此函数来调配前面保存的虚拟内存页。

可以通过调用GloballLock()函数来强制使内存块留在物理内存中,应该谨慎使用此函数,因为它阻止系统管理这块内存,直到调用GlobalUnlock()函数为止。如果一个进程锁定了一大块内存,其他进程就会终止,不管还有多少内存。

函数VirtualProtect()用于改变一块内存的访问权限,VirtualQuery()函数返回内存页的住处。如果想访问其他进程的页面,可以通过调用VirtualProtecteEx和VirutalQueryEx两个函数来实现。

春天 发表于 5/6/2006 3:26:27 PM 评论:0

领导在五一之前给我下了任务,需要用内存共享,可是我都没有听过这个东西,这怎么办呢。。告诉领导我没有接触过这些,领导却给我来一句,没关系,你放假的回去查查资料,回来主要做这个,我晕,晕死了。。

从网上查了一下,竟然真的有这方面的资料,不过,好像不是太多。。


进程之间数据的共享可以用共用内存实现,在Win32中,进程之间共享内存使用的事映射文件。虚拟内存系统具有把实际内存映射到页文件或者交换文件的能力。用户可以把内存映射到任何的映射文件中,包括系统内存页。而利用系统内存页可以实现快捷的内存共享。      利用共有内存实现进程之间的数据共享共有两部:一.    使用CreateFileMapping函数创建内存映射文件。此函数需要文件句柄,对于大多数的内存共享应用程序,建此文件句柄设置为0xFFFFFFFF即可。这样的句柄指向系统内存页文件。二.    映射文件文件创建成功以后,以其返回的句柄作为参数,调用MapViewOfFile函数为内存映射文件对象创建视,MapViewOfFile函数将返回指向文件的视指针。可以利用此视指针对内存映射文件进行操作,内存的读写简化到了就像普通变量的操作。 下面是一个利用共有内存实现进程之间的数据共享的Sample程序。

//写内存程序

 

 

//MemWrite.cpp

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

class student
{
public:
 long ID;
 char name[20];
};

void main()
{

 HANDLE hMemShare;

 student stu;
    int stu_num = 30;

 student *lpstu;

 stu.ID = 99041232;
 strcpy(stu.name,"SecBug");

 hMemShare = CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,sizeof(student),"TestMemShare");

 if(hMemShare == NULL)
 {
  cout<<"Failed to Alloocate"<<endl;
  return;
 }

 lpstu = (student *)MapViewOfFile(hMemShare, FILE_MAP_WRITE,0,0,sizeof(student));

 if(lpstu == NULL)
 {
  cout<<"Failed to Map"<<endl;
  return;   
 }

 *lpstu = stu;

 while(1){}

 UnmapViewOfFile(lpstu);
}

 

//内存程序

 

// MemRead.cpp

#include "stdafx.h"

#include "windows.h"
#include "iostream.h"

class student
{
public:
 long ID;
 char name[20];
};

void main()
{

 HANDLE hMemShare;

 student stu;

 student *lpstu;

 char *lpTch;

 stu.ID = 0;

 strcpy(stu.name ,"tst");

 hMemShare = OpenFileMapping(FILE_MAP_READ,FALSE,"TestMemShare");

 if(hMemShare == NULL)
 {

  cout<<"File Created Failed"<<endl;

  return;
 }


 lpstu = (student *)MapViewOfFile(hMemShare, FILE_MAP_READ,0,0,sizeof(student));

 if(lpTch == NULL)
 {
  cout<<"Failed to Map"<<endl;
  return;
 }

 stu = *lpstu;

 cout<<stu.ID<<endl;
 cout<<stu.name<<endl;

 UnmapViewOfFile(lpstu);
}

春天 发表于 5/6/2006 3:08:18 PM 评论:0

  看别人都写工作日志,我也没有,看到一些可能有用的东西,转来存下,以防以后找不到。有时候总会想学点linux,可是无从下手,一个网友告诉我,把你在win下面的工作都转到linux下面去,就算已经在win下面做完了,还可以在linux下面做一次,我想如果有时间的话,这确实是个不错的主意。


Linux操作系统下串口编程入门教程

Linux操作系统下串口编程入门教程
作者:佚名 文章来源:不详 点击数:199 更新时间:2005-11-6

--------------------------------------------------------------------------------

  简介:

  Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍。

  串口简介

  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4%的情况下,传输电缆长度应为50英尺。

  Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍,如果要非常深入了解,建议看看本文所参考的《Serial Programming Guide for POSIX Operating Systems》

  串口操作

  串口操作需要的头文件
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/

打开串口

在 Linux 下串口文件是位于 /dev 下的。串口一 为 /dev/ttyS0,串口二 为 /dev/ttyS1。打开串口是通过使用标准的文件打开函数操作:

int fd;
/*以读写方式打开串口*/
fd = open( "/dev/ttyS0", O_RDWR);
if (-1 == fd){
/* 不能打开串口一*/
perror(" 提示错误!");
}

设置串口

  最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。

struct termio
{ unsigned short c_iflag; /* 输入模式标志 */
unsigned short c_oflag; /* 输出模式标志 */
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};

  设置这个结构体很复杂,我这里就只说说常见的一些设置:

  波特率设置 下面是修改波特率的代码:

struct termios Opt;
tcgetattr(fd, &Opt);
cfsetispeed(&Opt,B19200); /*设置为19200Bps*/
cfsetospeed(&Opt,B19200);
tcsetattr(fd,TCANOW,&Opt);

设置波特率的例子函数:

/**
*@brief 设置串口通信速率
*@param fd 类型 int 打开串口的文件句柄
*@param speed 类型 int 串口速度
*@return void
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200,漀?朦?????????? B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,
19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed){
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {
if (speed == name_arr[i]) {
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
status = tcsetattr(fd1, TCSANOW, &Opt);
if (status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}

设置效验的函数:

/**
*@brief 设置串口数据位,停止位和效验位
*@param fd 类型 int 打开的串口文件句柄
*@param databits 类型 int 数据位 取值 为 7 或者8
*@param stopbits 类型 int 停止位 取值为 1 或者2
*@param parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if ( tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size "); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable 漀?朦??????????parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported parity ");
return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits ");
return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
}

需要注意的是: 如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /*Output*/

读写串口

设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。

·发送数据

char buffer[1024];int Length;int nByte;nByte = write(fd, buffer ,Length)

·读取串口数据

使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。
char buff[1024];int Len;int readByte = read(fd,buff,Len);

关闭串口

关闭串口就是关闭文件。

close(fd);

例子

下面是一个简单的读取串口数据的例子,使用了上面定义的一些函数和头文件

/**********************************************************************
代码说明:使用串口二测试的,发送的数据是字符,
但是没有发送字符串结束符号,所以接收到后,后面加上了结束符号。
我测试使用的是单片机发送数据到第二个串口,测试通过。
**********************************************************************/
#define FALSE -1
#define TRUE 0
/*********************************************************************/
int OpenDev(char *Dev)
{
int fd = open( Dev, O_RDWR );
//| O_NOCTTY | O_NDELAY
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
int main(int argc, char **argv){
int fd;
int nread;
char buff[512];
char *dev = "/dev/ttyS1"; //串口二
fd = OpenDev(dev);
漀?朦??????????set_speed(fd,19200);
if (set_Parity(fd,8,1,'N') == FALSE) {
printf("Set Parity Error ");
exit (0);
}
while (1) //循环读取数据
{
while((nread = read(fd, buff, 512))>0)
{
printf(" Len %d ",nread);
buff[nread+1] = '';
printf( " %s", buff);
}
}
//close(fd);
// exit (0);
}

春天 发表于 4/27/2006 2:31:33 PM 评论:2

  今天上网没有什么事情,偶尔看到一个学校参见IBM的全国高校SOA大赛的blog,突然想起我们学校来,那个虽然不怎么有名,却让我在此学习生活了4年的学校。。我们学校会不会组织学生参加这样的大赛呢。。从学校出来融入社会,深刻感受到外面的力量是如此强大,不管是人际、还是技术,都让我有点无地自容。。我想如果在学校的时候能够多接触一些前沿的、深层的技术,也不至于对待工作会如此心惊胆战。。

  上去学校的网站,一个计算机学院,一个自动化学院,打开的速度如此之慢,有点不能忍受,特别是自动化学院的那个网页。。怎么可以这样呢。。看看上面好像没有什么东西,有一个交流的版块,是为了让学生和老师留言的,我就在想,看看能不能留言啊,好说歹说也是从这里出来的学生阿。。竟然能注册。。我晕。。我也不是学生,就随便注册成2001级计算机1班的一名学生了。。计算机学院的网站做成这个样子,实在有点说不过去。。感叹!!虽然我不懂做网络方面。。。


  有时候真希望大学能重新过一遍,我就知道该干些什么,也不至于毕业这么久了还感叹以前的时光。。
春天 发表于 4/26/2006 1:25:22 PM 评论:1
春天 发表于 4/24/2006 9:04:59 AM 评论:1


不用害怕寒冷、孤单、寂寞。不用心烦嘈杂、伪善、做作。一起去看海吧!


春天 发表于 4/13/2006 4:58:42 PM 评论:2
  下一页 尾页 (本页为第 1 页 共3页)