Serial库内API说明

本文介绍了一个便携式串口通信接口类,详细解释了其构造方法及多种成员函数的功能,如打开、关闭串口,获取串口状态,读写数据等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此类提供了一个便携式的串口接口。

1. 构造器和解析器

serial::Serial::Serial  (   **const std::string &**     port = "",
                            **uint32_t**    baudrate = 9600,
                            **Timeout**     timeout = Timeout(),
                            **bytesize_t**  bytesize = eightbits,
                            **parity_t**    parity = parity_none,
                            **stopbits_t**  stopbits = stopbits_one,
                            **flowcontrol_t**   flowcontrol = flowcontrol_none 
)   

创建了要给Serial对象并且如果端口指定的话打开端口,否则端口保持关闭,知道serial::Serial::open被调用。
参数:
port 一个std::string包含了串口地址;
baudrate 一个表示波特率的无符号32位整数;
timeout 一个serial::Timeout结构体,定义了串口的暂停条件;
bytesize 每个位组在串口数据传输的大小,默认是八位,可能的值是五位,六位,七位,八位;
parity 奇偶检验的方法,默认是无,可能的值是:无,奇校验,偶校验;
stopbits 使用的停止位的数量,默认是一位停止位,可能的值是:一位,一点五位,两位;
flowcontrol使用的控制流的类型,默认是无控制流,可能的值是:无,软件控制,硬件控制。

2. 成员函数

**size_t** Serial::available()  
{
  return pimpl_->available ();
}

返回缓存中字符的数量;

**void** Serial::close()    
{
  pimpl_->close ();
}

关闭串口;

**void** Serial::flush()    
{
  ScopedReadLock(this->pimpl_);
  ScopedWriteLock(this->pimpl_);
  pimpl_->flush ();
  read_cache_.clear ();
}

清理输入和输出的缓存;

**void** Serial::flushInput ()  
{
  ScopedReadLock(this->pimpl_);
  pimpl_->flushInput ();
}

仅清楚输入的缓存;

**void** Serial::flushOutput()  
{
  ScopedWriteLock(this->pimpl_);
  pimpl_->flushOutput ();
  read_cache_.clear ();
}

仅清除输出的缓存;

**uint32_t** Serial::getBaudrate()const
{
  return uint32_t(pimpl_->getBaudrate ());
}

获得端口波特率;

**bytesize_t** Serial::getBytesize()const   
{
  return pimpl_->getBytesize ();
}

获得数据传输位的大小;

**string** Serial::getPort  ()  const   
{
  return pimpl_->getPort ();
}

获得端口ID;

**bool** Serial::isOpen (       )   const
{
  return pimpl_->isOpen ();
}

获得串口的打开状态,端口打开返回true,否则返回false;

**void** Serial::open()     
{
  pimpl_->open ();
}

打开串口,只要设置好端口且此端口没有打开;如果端口在结构体中设置,那么这个调用就不需要了;

**size_t** Serial::read (uint8_t* buffer , size_t size)
{
  ScopedReadLock (this->pimpl_);
  return this->pimpl_->read (buffer, size);
}

从串口读取指定位数的数据到指定的缓存中;

读取函数在以下三种情况的一种满足即返回:

  • 要求位数的数据读取完成,在这种情况下,需要的位数和读取返回的size_t一致;
  • timeout(暂停)发生,在这种情况下,读取返回的值和需要的值不匹配,但是没有exception抛出;
  • exception发生,这种情况下,实际的exception抛出;

参数:
buffer 至少是需要大小的一个unit8_t数组;
size 一个size_t,定义了要读取得数据位数;
返回:
一个size_t,代表读取结果的位的数量;

**size_t** Serial::read (std::string& buffer,size_t size = 1)
{
  ScopedReadLock (this->pimpl_);
  uint8_t *buffer_ = new uint8_t[size];
  size_t bytes_read = this->pimpl_->read (buffer_, size);
  buffer.append (reinterpret_cast<const char*>(buffer_), bytes_read);
  delete[] buffer_;
  return bytes_read;
}

读取一个给定大小的数据到一个给定的缓存中;

返回与上个函数一样;

**string** Serial::read (   size_t  size = 1    )   
A std::string containing the data read from the port.
{
  std::string buffer;
  this->read (buffer, size);
  return buffer;
}

**size_t** Serial::write(const uint8_t* data,size_t size)       
{
  ScopedWriteLock(this->pimpl_);
  return this->write_(data, size);
}

写一个字符串到串口;
参数:
data 一个常量包含了写入串口的数据;
size 指出从给定数据缓存中写入串口的位数;

返回实际写入串口的数据的位数;

**size_t** Serial::write(const std::vector<uint8_t>& data)  
{
  ScopedWriteLock(this->pimpl_);
  return this->write_ (&data[0], data.size());
}

**size_t** serial::Serial::write(const std::string & data)  
Write a string to the serial port.

Parameters:
data    A const reference containing the data to be written to the serial port.
Returns:
A size_t representing the number of bytes actually written to the serial port.
<think>好的,用户想了解Oracle EBS中的存转移API。首先,我需要回忆一下Oracle EBS的相关模块,存管理属于Inventory模块,而存转移涉及物料在不同子存或组织间的移动。API部分,常用的可能是Inventory相关的开放接口或公共API。 接下来,用户可能需要知道具体的API名称、功能以及如何使用。常见的存操作API包括INV_TRANSACTION_INTERFACE_PUB和INV_MATERIAL_TRANSACTION_PUB。这些API用于处理事务处理,比如转移、发放、接收等。 需要区分组织内转移和组织间转移。组织内转移可能涉及子存之间的转移,而跨组织转移则需要考虑发运和接收步骤,可能涉及采购模块或存模块的不同API。 另外,存转移可能涉及成本组、批次、序列号等复杂属性,API需要支持这些参数的传递。用户可能关心如何构建有效的事务处理记录,包括项目编号、数量、来源和目标子存、事务日期等。 还需要考虑错误处理和事务处理的状态查询,比如如何通过接口表查看错误信息,确保事务处理成功。可能涉及到的表包括MTL_MATERIAL_TRANSACTIONS_TEMP和MTL_TRANSACTION_INTERFACE,以及如何通过API返回的状态进行判断。 用户可能是开发人员或系统管理员,需要集成外部系统与EBS进行存转移,或者自动化某些业务流程。因此,示例代码或调用步骤会很有帮助。需要确保提供正确的参数,如存项目ID、组织ID、转移类型、数量等,并调用合适的API方法。 另外,需要注意权限和并发请求的处理,有些API可能需要通过并发程序异步处理事务。同时,存转移可能触发其他模块的流程,如成本计算、在制品状态更新等,需确保事务的完整性。 最后,总结关键点,分步骤说明使用哪些API,注意事项,以及可能的参考文档或资源,帮助用户进一步查阅官方资料或示例代码。</think>以下是Oracle EBS存转移API的核心实现逻辑及步骤说明: ### 1. **核心API介绍** - **`INV_TRANSACTION_INTERFACE_PUB`** 用于将存事务数据插入接口表(`MTL_TRANSACTION_INTERFACE`),需通过并发请求`INCOIN`处理数据。 - **`INV_MATERIAL_TRANSACTION_PUB`** 直接处理存事务,无需接口表,适用于实时性要求高的场景。 ### 2. **组织内转移(子存间)** ```sql -- 调用示例(伪代码) l_return_status := INV_MATERIAL_TRANSACTION_PUB.MATERIAL_TRANSACTION ( p_api_version => 1.0, p_init_msg_list => FND_API.G_TRUE, p_commit => FND_API.G_TRUE, x_return_status => l_return_status, x_msg_count => l_msg_count, x_msg_data => l_msg_data, p_transaction_type => '子存转移', -- 事务类型 p_organization_id => 101, -- 组织ID p_inventory_item_id => 10001, -- 物料ID p_transaction_date => SYSDATE, p_transaction_qty => 50, -- 转移数量 p_subinventory_code => 'MAIN', -- 来源子存 p_transfer_subinventory => 'WIP' -- 目标子存 ); ``` ### 3. **跨组织转移** 需分两步处理: - **Step1. 发运组织调用API** 使用事务类型`组织转移`,指定`TRANSFER_ORGANIZATION_ID`为目标组织。 - **Step2. 接收组织运行`接收事务处理`** 通过`RCV_SHIPMENT_LINE_PUB`处理接收。 ### 4. **必填参数清单** - `存项目ID` (`p_inventory_item_id`) - `组织ID` (`p_organization_id`) - `事务数量` (`p_transaction_qty`) - `来源/目标子存` (`p_subinventory_code`/`p_transfer_subinventory`) - `事务类型` (`p_transaction_type`,如`子存转移`) ### 5. **错误排查要点** - 检查`MTL_INTERFACE_ERRORS`表获取错误明细 - 验证物料是否在目标子存有效 - 确保批次/序列号在转移前后状态一致 - 检查存弹性域上下文是否匹配 ### 6. **附加功能支持** - **批次转移**:需传入`p_lot_number` - **序列号转移**:使用`INV_SERIAL_NUMBER_PUB`接口 - **成本组更新**:通过`p_cost_group_id`参数指定 ### 7. **完整调用流程** 1. 初始化API环境(`FND_API.GLOBAL.INITIALIZE`) 2. 填充事务记录参数 3. 调用`MATERIAL_TRANSACTION` API 4. 检查`x_return_status`是否为`S` 5. 提交事务(`FND_API.G_COMMIT`) 6. 异常时调用`FND_MSG_PUB.GET`获取错误堆栈 ### 8. **关键数据表** - `MTL_MATERIAL_TRANSACTIONS`(事务主表) - `MTL_TRANSACTION_ACCOUNTS`(成本分录) - `MTL_ONHAND_QUANTITIES`(实时存量) > 📌 **提示**: > - 正式环境建议先在测试实例验证事务逻辑 > - 跨组织转移需配置`组织关系`和`内部订单` > - 详细参数参考官方文档《Oracle Inventory API Reference》
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值