2015-07-25 4 views
5

Я разрабатываю приложение для портативного считывателя Motorola MC9190 RFID.Возможно ли записать и прочитать символ ASCII в теге RFID UHF?

Я нуждаюсь в чтении и записи информации как читаемый человеком в теге RFID UHF. Поэтому я решил написать информацию в символах ASCII.

При проведении некоторых исследований я обнаружил, что можно записать символ ASCII в память метки RFID, но он поддерживает меньшее количество символов. Я бы не возражал, пока не было менее 10 символов.

ссылки:

https://support.tracerplus.com/index.php?/Knowledgebase/Article/View/199/15/encoding-rfid-tags-with-ascii-values-vs-hexadecimal-values-whats-the-difference

http://blog.atlasrfidstore.com/types-of-memory-in-gen-2-uhf-rfid-tags

Теперь, я немного смущен, как я пишу и читать ASCII символов непосредственно в считыватель.

Это код для записи в шестнадцатеричном символе.

private void writeButton_Click(object sender, EventArgs e) 
{ 
    string dataToWrite="ABCDEF9876"; 
    Symbol.RFID3.TagAccess.WriteAccessParams m_WriteParams; 

    m_WriteParams.AccessPassword = 0; 

    m_WriteParams.MemoryBank = MEMORY_BANK.MEMORY_BANK_USER; 
    m_WriteParams.ByteOffset = 0; 
    m_WriteParams.WriteDataLength = 6; 

    byte[] writeData = new byte[m_WriteParams.WriteDataLength]; 
    for (int index = 0; index < m_WriteParams.WriteDataLength; index += 2) 
    { 
     writeData[index] = byte.Parse(dataToWrite.Substring(index * 2, 2), 
      System.Globalization.NumberStyles.HexNumber); 
     writeData[index + 1] = byte.Parse(dataToWrite.Substring((index + 1) * 2, 2), 
      System.Globalization.NumberStyles.HexNumber); 
    } 

    m_WriteParams.WriteData = writeData; 
    string m_SelectedTagID = "ABCDEF";  //for example 
    RunWriteOperation(m_SelectedTagID,m_WriteParams); 
} 


void RunWriteOperation(string m_SelectedTagID,Symbol.RFID3.TagAccess.WriteAccessParams m_WriteParams) 
{ 
    if (m_SelectedTagID != String.Empty) 
    { 
     m_ReaderAPI.Actions.TagAccess.WriteWait(m_SelectedTagID,m_WriteParams, null); 
    } 
} 

Если я хочу писать в ASCII, он должен быть закодирован как байты ASCII, которые я предполагаю. Итак, вместо цикла for, если я заменил следующий код, будет ли он успешно записываться?

string dataToWrite="HELLOWORLD"; 
byte[] writeData = ASCIIEncoding.ASCII.GetBytes(dataToWrite); 

Поскольку у меня нет читателя со мной, я не смог проверить сейчас.

Если он получает успех при чтении тега, как настроить считыватель для декодирования как символа ASCII и отображать его или мне нужно будет программно преобразовать?

Поскольку я новичок в технологии RFID, я не уверен, что правильно провел исследование. Пожалуйста, поправьте меня, если я ошибаюсь.

+1

код вы показываете не будет работать, он ожидает, что 'dataToWrite' быть шестнадцатеричная строка, которая "HelloWorld" не является. Метод Encoding.GetBytes() даст вам байты, которые образуют строку в данной кодировке, да. Обратное делается через Encoding.GetString(), используя ту же кодировку, что и для кодирования. – CodeCaster

+0

Упс. Ты прав. См. Мое редактирование. –

+0

Итак, вы прочитали остальную часть моего комментария? Какой у Вас вопрос? – CodeCaster

ответ

0
void hex2dec(unsigned adchex,unsigned value) 
{ 
unsigned value[4]; 

for(i=0;i<4;i++) 
{ 
value[i]=adchex%10; 
// value[i]=adchex%10+0x30; //for ASCII presentation 
adchex=adchex/10; 
} 
} 

Вы также можете посмотреть на этот SDK здесь: http://www.tsl.uk.com/2013/07/tsls-ios-uhf-ascii-2-0-sdk-v0-8-1-now-available/

TSLAsciiCommands.framework - набор простых в использовании Objective классов C Инкапсуляция TSL УВЧ ASCII протокол 2.0 предоставляется в качестве универсального статическая структура, которая может быть использована как с IOS устройств и IOS симулятор - TSL ASCII 2.0 SDK документация - доступна как docset для интеграции в Xcode и в формате HTML - быстрый пуск Примеры проектов Xcode


Если вы используете инфраструктуру TSLAsciiCommands, вы можете сделать что-то вроде этого.

-(void)initAndShowConnectedReader 
{ 
if(_commander.isConnected) 
{ 
    // Display the serial number of the successfully connected unit 
    [self.selectReaderButton setTitle:_currentAccessory.serialNumber forState:UIControlStateNormal]; 

    // Ensure the reader is in a known (default) state 
    // No information is returned by the reset command 
    TSLFactoryDefaultsCommand * resetCommand = [TSLFactoryDefaultsCommand synchronousCommand]; 
    [_commander executeCommand:resetCommand]; 

    // Notify user device has been reset 
    if(resetCommand.isSuccessful) 
    { 
     self.resultsTextView.text = [self.resultsTextView.text stringByAppendingString:@"Reader reset to Factory Defaults\n"]; 
    } 
    else 
    { 
     self.resultsTextView.text = [self.resultsTextView.text stringByAppendingString:@"!!! Unable to reset reader to Factory Defaults !!!\n"]; 
    } 

    // Update the version information for the connected reader 
    [_commander executeCommand:self.versionInformationCommand]; 

    if([self.class comparableVersionValue:self.versionInformationCommand.asciiProtocol] < [self.class comparableVersionValue:MINIMUM_ASCII_PROTOCOL_VERSION_FOR_LICENCE_KEY_COMMAND]) 
    { 
     [self updateResults:[NSString stringWithFormat:@"Reader does not support licence keys\nRequires ASCII protocol: %@\nReader ASCII protocol: %@\n", 
          MINIMUM_ASCII_PROTOCOL_VERSION_FOR_LICENCE_KEY_COMMAND, 
          self.versionInformationCommand.asciiProtocol 
          ]]; 
    } 
    [self validateReader]; 
} 
else 
{ 
    [self.selectReaderButton setTitle:@"Tap to select reader..." forState:UIControlStateNormal]; 
    [self updateUIState]; 
} 
} 

или

// Write data to general tag memory 
string tagDataStr = "HELLO WORLD!"; 
byte[] tagData = ASCIIEncoding.ASCII.GetBytes(tagDataStr); 
byte memBank = 0; // Different memory banks serve different purposes.  See MC9190 specifications. 
int addr = 0; 
byte words = (byte)(tagData.Length/2); // Words = length of msg/2 

if (UHFWriteTagData(theHandle, readerType, memBank,addr, tagData,  (byte)tagData.Length, out errValue) == 0) 
{ 
// Handle Error 
} 

// Read data from tag memory 
byte[] readTagData = new byte[512]; 
int bytesRead; 

if (UHFReadTagData(theHandle, readerType, memBank, addr, words,  readTagData, 
readTagData.Length, out bytesRead, out errValue) == 0) 
{ 
// Handle Error 
} 


// Display Results 
string results = 
"Input tag ID: " + 
tagIDStr + 
Environment.NewLine + 
"Read tag ID: " + 
ASCIIEncoding.ASCII.GetString(readTagID).Replace('\0','-') + 
Environment.NewLine + 
"Input tag data: " + 
tagDataStr + 
Environment.NewLine + 
"Read tag data: " + 
ASCIIEncoding.ASCII.GetString(readTagData).Replace('\0', '-').Substring(0,bytesRead) + 
Environment.NewLine; 

MessageBox.Show(results); 
+0

Вы имеете в виду, что я должен включать тильду перед данными вроде string dataToWrite = "~ HELLOWORLD"; –

+0

См. Править. – tymac

+0

Я не понимаю ваш первый код. И я не использую рамки TSLAsciiCommands. можете ли вы объяснить ответ четко? Это то, что мне нужно, я хочу передавать информацию как символ ASCII в UHF-тегах –