Android SMD数据通信概述

在Linux中,基于SMD的数据通信是以信道的形式作为一个设备存在的,作为一种双向信道,其接口的实现遵循Linux设备驱动规范。在Qucalcomm平台上,SMD的缓冲大小为8192bit,最大信道数为64,SMD的头大小为20bit。

SMD的相关代码实现主要位于aurora\msm\msm\arch\arm\mach-msm目录下。主要文件包括:smd.c、smd_nmea.c、smd_qmi.c、smd_rpcrouter.c、smd_rpcrouter_clients.c、smd_ rpcrouter_device.c、smd_rpcrouter_servers.c、smd_tty.c等。

SMD信道需要同时维护接收信道、发送信道的状态和数据信息,SMD的信道定义如下:

struct smd_channel {
        volatile struct smd_half_channel *send; //发送握手信道
        volatile struct smd_half_channel *recv; //接收握手信道
        unsigned char *send_buf; //发送信道数据
        unsigned char *recv_buf; //接收信道数据
        unsigned buf_size;
        struct list_head ch_list; //信道列表
        unsigned current_packet;
        unsigned n;
        void *priv;
        void (*notify)(void *priv, unsigned flags);
        int (*read)(smd_channel_t *ch, void *data, int len); //读数据
        int (*write)(smd_channel_t *ch, const void *data, int len); //写数据
        int (*read_avail)(smd_channel_t *ch); //是否可读
        int (*write_avail)(smd_channel_t *ch); //是否可写
        int (*read_from_cb)(smd_channel_t *ch, void *data, int len);
        void (*update_state)(smd_channel_t *ch);
        unsigned last_state;
        char name[20];
        struct platform_device pdev;
        unsigned type;
    };

共享信道的信道状态在其握手信道中记录,握手信道的定义如下:

struct smd_half_channel {
        unsigned state;
        unsigned char fDSR;
        unsigned char fCTS;
        unsigned char fCD;
        unsigned char fRI;
        unsigned char fHEAD; //头部
        unsigned char fTAIL; //尾部
        unsigned char fSTATE; //状态
        unsigned char fUNUSED;
        unsigned tail;
        unsigned head;
    };

在实际实现中,SMD信道分配被封装在SMEM(Shared Memory Manager)模块中,系统提供了smem_init()、smem_alloc()、smem_get_entry()等内存操作函数供SMD和SMSM操作。

SMD的状态共有SMD_SS_CLOSED、SMD_SS_OPENING、SMD_SS_OPENED、SMD_SS_FLUSHING、SMD_SS_CLOSING、SMD_SS_RESET、SMD_SS_RESET_OPENING等。其变化过程如图1-1所示。

图1-1  SMD的状态机

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于缺乏具体的信息和背景,我们无法提供完整的代码和示例。以下是一些可能有用的信息: 1. SMD零件计数器通常使用红外线传感器检测零件通过计数器的情况。 2. 串口通信可能包括以下步骤: a. 初始化串口(波特率、数据位、停止位等)。 b. 打开串口。 c. 发送数据或接收数据。 d. 关闭串口。 3. 根据具体的硬件和软件平台,代码可能会有所不同。 以下是一个可能的示例代码,用于在Arduino上与SMD零件计数器进行串口通信: ``` #include <SoftwareSerial.h> // 定义软串口的引脚 SoftwareSerial mySerial(2, 3); // RX, TX void setup() { // 初始化串口 Serial.begin(9600); mySerial.begin(9600); // 等待串口连接 while (!Serial) { ; } Serial.println("Serial connected"); } void loop() { // 发送命令到计数器 mySerial.write("GET_COUNT\n"); // 等待计数器的回应 delay(100); while (mySerial.available()) { char c = mySerial.read(); Serial.write(c); } } ``` 在上面的示例代码中,我们使用了SoftwareSerial库来模拟一个串口。我们在引脚2和3上创建了一个软串口对象,用于与计数器进行通信。在setup()函数中,我们初始化了两个串口并等待它们连接。在loop()函数中,我们向计数器发送一个命令(GET_COUNT)并等待它的回应。一旦计数器回应,我们将其内容打印到串口监视器中。请注意,上述代码仅供参考,并且可能需要根据具体情况进行更改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值