俩台电脑,一个51,一个ARM linux 电脑如何将这边的信息,传送到另一端

查阅了一下前人的做法,有两种:1.硬方法:另加一51单片机的板子来做转换,串口模式采用方式1来与ARM板通信,另一头用方式2或3来与9bit的单片机通信;2.软方法:改驱动,即在linux的串口驱动中加入对第9位的收发。

我这里是用方法二。一开始很不想改driver,就在网上各种搜,搜到的方法是:采用奇偶校验的mask和space来设定第九位为“1”或“0”;串口的设置代码为:

试过之后发现有时是9bit,有时是8bit,或者是第9bit不受mask和space的控制(测试方式很吐血,直接拿示波器看的,高低电平一个一个数!)。看来这样的设置只是设了奇偶校验,根本没设到mask和space,难道是driver不支持?只有这个原因了!于是开始学改driver,最后是在samsung.c这个驱动文件中发现虽然定义了CMSPAR,却完全没有用到,于是修改如下:


修改ulcon寄存器设置,如下:

接着就是重新编译内核,通过vivi下载到板上。测试程序中按照上述方法设置结构体termios变量,就可以实现第9位的mask和space了。经测试,mini2440已可与51单片机通信!


kernel、filesystem和App应用程序。使用时,按照主机平台,可以下载以下任一版本中的一个,结果是一样的:

  • Linux解压版在Linux主机(如Ubuntu、RedHat等)直接解压即可使用。推荐方式!
  • Linux安装版在Linux主机下执行后按照提示安装后使用。
  • RPM安装版RedHat系统安装包,新版本不提供该类安装包。
  • 源码版交叉编译器源代码,一般很少用到。

为方便国内用户下载使用,我们从Codesourcery(Mentor)官网下载了所有版本的arm-none-linux-gnueabi-gcc编译器,并放到国内云盘上提供下载。因为版本很多,可能难以选择,但是我们建议您使用最新版本,即有最新~标志的下载项。

Mentor官方下载地址(需要注册,注册之后官方会发送一个下载地址到邮箱里面):。

本机进程使用进程号区别不同的进程进程间通信方式有管道、信号、消息队列、共享内存、信号量等。网络中进程间的通信首先需要识别进程所在主机在网络中的唯一标识即网络层的IP地址主机上的进程可以通过传输层的协议与端口号识别。


二、Socket通信的基础知识

主机字节序即内存中存储字节的方式分为大端序和小端序。何为大端、小端呢小端将低字节存储在低地址。大端将高字节存储在低字节。网络中在处理多字节顺序时一般采用大端序。在网络传输时需要把主机字节序转换到网络字节序常用的转换函数如下


J包调用accept函数接收请求向客户端发送SYN K ACK J+1这时accept进入阻塞状态客户端收到服务器的SYN K K+1accept返回至此三次握手完毕连接建立。


    TCP连接是全双工的每个方向都必须单独进行关闭。当一方完成数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭而另一方执行被动关闭。

A、客户端A发送一个FIN用来关闭客户A到服务器B的数据传送

B、服务器B收到这个FIN它发回一个ACK确认序号为收到的序号加1。和SYN一样一个FIN将占用一个序号。

   C、服务器B关闭与客户端A的连接发送一个FIN给客户端A。

   D、客户端A发回ACK报文确认并将确认序号设置为收到序号加1。

 因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后它可以把ACKSYNACK起应答作用而SYN起同步作用放在一个报文里来发送。但关闭连接时当收到对方的FIN报文通知时仅仅表示对方没有数据发送给你了但你所有的数据未必都全部发送给对方了你未必会马上会关闭SOCKET你可能还需要发送一些数据给对方之后再发送FIN报文给对方来表示你同意现在可以关闭连接了所以ACK报文和FIN报文多数情况下都是分开发送的。
ESTABLISH状态那样但是因为我们必须要假想网络是不可靠的你无法保证你最后发送的ACK报文会一定被对方收到因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文而重发FIN报文所以这个TIME_WAIT状态的作用就是用来重发可能丢失的

Socket编程的一般流程如下

IPV4的协议地址结构

IPV6的协议地址结构

接收客户端的请求建立连接套接字

    如果accept成功返回则服务器与客户已经正确建立连接了服务器通过accept返回的套接字来完成与客户的通信。

    accept默认会阻塞进程直到有一个客户连接建立后返回返回的是一个新可用的连接套接字。

在调用listen函数之后socket函数生成的主动连接的普通套接字就转变为监听套接字一般被accept函数调用的sockfd就是监听套接字

     一个服务器程序通常只创建一个监听套接字在服务器程序的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个连接套接字当服务器完成了对某个客户的服务相应的连接套接字就被关闭。

     连接套接字并没有占用新的端口与客户端通信依然使用的是与监听套接字sockfd一样的端口号

成功执行后客户端通过调用connect函数来建立与TCP服务器的连接。

    当读成功时read返回实际所读的字节数如果返回的值是0表示已经读到文件的结束小于0表示出现了错误。如果错误为EINTR说明读是由中断引起的如果是ECONNREST表示网络连接出了问题。

///成功返回非负描述字出错返回-1 ///连接服务器成功返回0错误返回-1

我要回帖

更多关于 ARM linux 电脑 的文章

 

随机推荐